我有一些控制器。在这个控制器中,我获得了OpenStruct对象,并希望将其保存到应用程序会话中。下一个代码工作正常:
session[:info] = OpenStruct.new(first_field: 1, second_field: 'two')
在此行之后 p session[:info]
打印
#<OpenStruct first_field=1, second_field="two">
但在此之后我会重定向到另一个控制器,当我在这个控制器中写p session[:info]
时我得到了
{"table"=>{"first_field"=>1, "second_field"=>"two"}}
那么,为什么我会得到这个,以及如何加载正确的OpenStruct实例?
答案 0 :(得分:2)
会话通常由值的哈希值和会话ID组成, 通常是一个32个字符的字符串,用于标识哈希值。发送的每个cookie 客户端的浏览器包含会话ID。另一种方式 round:浏览器会在每次请求时将其发送到服务器 客户。
您应该先将对象序列化,然后再将它们存储在会话中。
session[:info] = OpenStruct.new(first_field: 1, second_field: 'two').to_yaml
并使用
检索它YAML.load(session[:info])
来自rails文档的
不要在会话中存储大对象。相反,你应该存储它们 在数据库中并将其ID保存在会话中。这将消除 同步头痛,它不会填满你的会话存储 空间(取决于您选择的会话存储,请参阅下文)。这个 如果你修改一个对象的结构,那也是个好主意 它的旧版本仍然存在于某些用户的cookie中。与服务器端 会话存储您可以清除会话,但与客户端 存储,这很难缓解。
或将您的会话商店从cookie_store
更改为cache_store
在environment
更改
config.session_store :cookie_store
到
config.session_store :cache_store