【问题标题】:Keeping random numbers the same after refresh, Rails刷新后保持随机数相同,Rails
【发布时间】:2018-10-10 02:53:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby-on-rails random reload


    【解决方案1】:

    据我了解,你想要:

    • 如果页面重新加载,页面上的随机数将保持不变
    • 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 %>
    

    【讨论】:

    【解决方案2】:

    我认为 cookie 是解决您的问题的好主意,请在您的控制器中尝试以下示例:

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

    那么在你看来:

    <%= cookies[:number] %>
    

    这样做是你想要的吗?

    【讨论】:

    • cookies 会起作用,但是当我更改页面时,数字不会保持不变吗?那么下一个问题会有完全相同的随机数吗?既然是问题展示方式,所以当我查看不同的问题时,数字不会保持不变吗?
    • @RailroadTycoon 你也可以使用 session 来存储它。
    • @RailroadTycoon 不是您的问题,“刷新后保持随机数相同”抱歉,我不知道您想做什么。
    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    相关资源
    最近更新 更多