在刷新后保持随机数相同,Rails

时间:2018-04-30 02:27:23

标签: ruby-on-rails random reload

我正在创建一个多选项生成器,可以根据输入数据生成多项选择答案。随机数生成器位于页面的控制器中。在刷新期间调用控制器,因此随机数会发生变化。

我想过将随机数存储在会话中。但即使我想更改输入数据(例如加载新页面),这也会导致所有随机数保持不变。

有没有办法在页面刷新期间阻止控制器操作?或者另一种让随机数在页面刷新时保持不变的简单方法,但在加载新页面时会改变吗?

2 个答案:

答案 0 :(得分:2)

根据我的理解,你想要:

  • IF页面重新加载,随机数在页面上保持不变
  • ELSE如果更改/新页面,将重新生成随机数

然后你可以这样做:

<强> 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 %>

答案 1 :(得分:0)

我认为Cookie对你的问题是个好主意,试试这个例子,在你的控制器中:

def index
  cookies[:number] ||= SecureRandom.hex(4)
end

然后在你看来:

<%= cookies[:number] %>

这样做你想要的吗?