1

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

4

1 回答 1

2

一个会话通常由一个哈希值和一个会话 ID(通常是一个 32 个字符的字符串)组成,用于标识哈希。每个发送到客户端浏览器的 cookie 都包含会话 ID。反之亦然:浏览器将根据客户端的每个请求将其发送到服务器。

您应该先序列化您的对象,然后再将它们存储在会话中。

session[:info] = OpenStruct.new(first_field: 1, second_field: 'two').to_yaml

并使用检索它

YAML.load(session[:info])

来自 Rails 文档

不要在会话中存储大对象。相反,您应该将它们存储在数据库中并将它们的 id 保存在会话中。这将消除同步问题,并且不会填满您的会话存储空间(取决于您选择的会话存储,见下文)。这也是一个好主意,如果您修改对象的结构并且它的旧版本仍在某些用户的 cookie 中。使用服务器端会话存储,您可以清除会话,但使用客户端存储,这很难缓解。

或将您的会话存储从更改cookie_storecache_store

在你的environment改变

config.session_store :cookie_store

config.session_store :cache_store
于 2015-12-08T12:34:44.890 回答