【问题标题】:How OpenStruct stored in sessionOpenStruct 如何存储在会话中
【发布时间】:2015-12-08 12:14:06
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails ruby session openstruct


    【解决方案1】:

    一个会话通常由一个哈希值和一个会话 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
    

    【讨论】:

    • 哦,我的问题很愚蠢,但你的回答很棒。序列化解决了它。够了,因为我的对象很小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2019-03-10
    • 2015-01-14
    • 2018-10-09
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多