我有控制器。在这个控制器中,我得到了OpenStruct对象,并希望将它保存到app会话中。下一段代码运行良好:
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实例呢?
发布于 2015-12-08 12:34:44
会话通常由一个值的散列和一个会话id (通常是32个字符的字符串)组成,以标识哈希。发送到客户端浏览器的每个cookie都包含会话id。相反,浏览器将在客户端的每个请求中将其发送到服务器。
在将对象存储在会话中之前,您应该序列化对象。
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_storehttps://stackoverflow.com/questions/34155613
复制相似问题