代码之家  ›  专栏  ›  技术社区  ›  calyxofheld

如何将从关联数组中选择的id存储在rails会话变量中?

  •  1
  • calyxofheld  · 技术社区  · 7 年前

    我非常了解如何在会话中存储id。你只要进入你的控制器

    @object = Object.find_by(params[:id)
    session[:first_object] = @object 
    

    但是如果在我的视图中有一大堆不同的对象,并且只需要将其中一个传递给会话呢?我不能用 hidden_fields . 通常我会把它作为一个论据传给 form_for 但是我更希望对象ID不显示在url中。

    <% @owned_objects.each do |obj| %>
     <%= form_for [obj, @wizard], as: :wizard, url: object_one_wizard_path(obj) do |f| %>
     bla bla
    <% end %>
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   EmmanuelB    7 年前

    在你的情况下,保存 id session 用户操作 (选择哪一个)。

    您需要发送 在里面 params 并显示在URL中 把它送过去 request body POST hidden_field . 如果你不想 你的 身份证件 作为敏感数据,您需要创建一些变通方法。

    我创造了一个 custom_route 会收到 encrypted_id 所以你不必写 在表格中。

    get "/set_id/:encrypted_id" => "your_controller#set_encrypted_id", as: :set_id_route
    

    在视图中,使用 沿着 MessageEncryptor 具体如下:

    <% cookies[:salt] = SecureRandom.urlsafe_base64(32) %>
    <% cookies[:pass] = 'some_password' %>
    <% key = ActiveSupport::KeyGenerator.new(cookies[:pass]).generate_key(cookies[:salt], 32) %>
    <% crypt = ActiveSupport::MessageEncryptor.new(key) %>
    <% @owned_objects.each do |obj| %>
      <%= form_for [obj, @wizard], 
                   url: set_id_route(encrypted_id: crypt.encrypt_and_sign(obj.id)), # Or however you send the id
                   as: :wizard, method: :get do |f| %>
          bla bla
          <%= f.submit %>
      <% end %>
    <% end %>
    

    id将在URL中发送,但不可读。

    然后在您想要接收请求的控制器中对其解密并将其设置为 阶段

    def set_encrypted_id
      key = ActiveSupport::KeyGenerator.new(cookies[:pass]).generate_key(cookies[:salt], 32)
      crypt = ActiveSupport::MessageEncryptor.new(key)
      session[:id] = crypt.decrypt_and_verify params[:encrypted_id]
      render json: { session_id: 'ok' }
    end
    

    我写了这个例子阅读和设置 cookies ENV 变量。在我的解决方案中,有些东西是不必要的,比如方法是 :get 或者说 在URL参数中发送(可以在 但想法是一样的。我希望这个答案对您有用:如果您需要用户交互,您需要以某种方式进行通信。