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实例?

会话通常由值的散列和会话id组成,通常是32个字符的字符串来识别散列。发送的每个cookie到客户端的浏览器包括会话idround:浏览器会在收到来自的每个请求时将其发送到服务器客户。

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

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

并使用检索

YAML.load(session[:info])

来自轨道文件

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

或者将会话存储从cookie_store更改为cache_store

在您的environment中更改

config.session_store :cookie_store

config.session_store :cache_store

相关内容

  • 没有找到相关文章

最新更新