【问题标题】:how can i store an id selected from an association array in a rails session variable?如何将从关联数组中选择的 id 存储在 Rails 会话变量中?
【发布时间】:2019-03-30 12:41:39
【问题描述】:

我非常了解如何在会话中存储 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 %>

【问题讨论】:

  • 您希望所有项目都在同一个会话密钥中还是每个对象的单独密钥?
  • @Mark 我只想要用户选择的任何对象的 id

标签: ruby-on-rails ruby session session-variables


【解决方案1】:

在您的情况下,将id 保存到session 需要一些用户操作(选择哪一个)。

您需要在params 中发送数据 并在URL 中显示它POST 方法的request body 中发送它,需要你可以使用hidden_field。如果您不想显示您的 id 是敏感数据,您需要创建一些解决方法。

我建议您使用某种加密方法在参数中传递您的数据,因为您主要担心的似乎是您不希望 id 可见。那里有很多加密方法和库,这只是我提出的解决方案。

我创建了一个custom_route,它将接收encrypted_id,因此您不必在表单中写hidden_field

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

在视图中,使用custom_routeMessageEncryptor,如下所示:

<% 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 中发送,但不可读。

然后在你想要接收请求的控制器中解密它并设置在session中。

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 或者 encrypted_id 在 URL 参数中发送(它可以在另一种方法的 request body 中发送),但想法是一样的.我希望这个答案对您有用:如果您需要用户交互,则需要以某种方式进行交流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-29
    • 2013-03-02
    • 2013-09-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多