在您的情况下,将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_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 中发送,但不可读。
然后在你想要接收请求的控制器中解密它并设置在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 中发送),但想法是一样的.我希望这个答案对您有用:如果您需要用户交互,则需要以某种方式进行交流。