刷新后保持随机数不变,Rails
Keeping random numbers the same after refresh, Rails
我正在创建一个多项选择生成器,它可以根据输入数据生成多项选择答案。随机数生成器位于页面的控制器中。控制器在刷新期间被调用,因此随机数会发生变化。
我想到了将随机数存储在会话中。但这会导致所有随机数保持不变,即使我确实想更改输入数据(例如加载新页面)。
有没有办法在页面刷新期间阻止控制器操作?或者另一种让随机数在页面刷新时保持不变但在加载新页面时改变的简单方法?
我认为 cookie 是解决你的问题的好主意,在你的控制器中试试这个作为例子:
def index
cookies[:number] ||= SecureRandom.hex(4)
end
那么在你看来:
<%= cookies[:number] %>
这是你想要的吗?
据我了解,你想要:
- 如果页面重新加载,页面上的随机数将保持不变
- 否则如果更改/新页面,将重新生成随机数
然后你可以这样做:
your_controller.rb:
before_action :set_random_number, only: [:index]
def set_random_number
message_encryptor = ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base)
# if no random number yet for this page, then generate, then redirect to same page but now with random_number param
if params[:random_number].blank?
# we need to encrypt the random_number so that user won't be able to manipulate the value in the query params
encrypted_random_number = Base64.urlsafe_encode64(
message_encryptor.encrypt_and_sign(
some_code_of_yours_that_generates_the_random_number
)
)
redirect_to request.query_parameters.merge(random_number: encrypted_random_number)
else
@random_number = message_encryptor.decrypt_and_verify(
Base64.urlsafe_decode64(params[:random_number])
)
end
end
index.html.erb:
<%= @random_number %>
我正在创建一个多项选择生成器,它可以根据输入数据生成多项选择答案。随机数生成器位于页面的控制器中。控制器在刷新期间被调用,因此随机数会发生变化。
我想到了将随机数存储在会话中。但这会导致所有随机数保持不变,即使我确实想更改输入数据(例如加载新页面)。
有没有办法在页面刷新期间阻止控制器操作?或者另一种让随机数在页面刷新时保持不变但在加载新页面时改变的简单方法?
我认为 cookie 是解决你的问题的好主意,在你的控制器中试试这个作为例子:
def index
cookies[:number] ||= SecureRandom.hex(4)
end
那么在你看来:
<%= cookies[:number] %>
这是你想要的吗?
据我了解,你想要:
- 如果页面重新加载,页面上的随机数将保持不变
- 否则如果更改/新页面,将重新生成随机数
然后你可以这样做:
your_controller.rb:
before_action :set_random_number, only: [:index]
def set_random_number
message_encryptor = ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base)
# if no random number yet for this page, then generate, then redirect to same page but now with random_number param
if params[:random_number].blank?
# we need to encrypt the random_number so that user won't be able to manipulate the value in the query params
encrypted_random_number = Base64.urlsafe_encode64(
message_encryptor.encrypt_and_sign(
some_code_of_yours_that_generates_the_random_number
)
)
redirect_to request.query_parameters.merge(random_number: encrypted_random_number)
else
@random_number = message_encryptor.decrypt_and_verify(
Base64.urlsafe_decode64(params[:random_number])
)
end
end
index.html.erb:
<%= @random_number %>