OpenStruct如何存储在会话

时间:2015-12-08 12:14:07

标签: ruby-on-rails ruby session openstruct

我有一些控制器。在这个控制器中,我获得了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实例?

1 个答案:

答案 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