首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenStruct如何存储在会话中

OpenStruct如何存储在会话中
EN

Stack Overflow用户
提问于 2015-12-08 12:14:06
回答 1查看 279关注 0票数 1

我有控制器。在这个控制器中,我得到了OpenStruct对象,并希望将它保存到app会话中。下一段代码运行良好:

代码语言:javascript
复制
session[:info] = OpenStruct.new(first_field: 1, second_field: 'two')

p session[:info]就在这行之后打印

代码语言:javascript
复制
#<OpenStruct first_field=1, second_field="two">

但是在这之后,我重定向到另一个控制器,当我在这个控制器中编写p session[:info]时,我得到

代码语言:javascript
复制
{"table"=>{"first_field"=>1, "second_field"=>"two"}}

那么,为什么要这样做,如何加载正确的OpenStruct实例呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-08 12:34:44

会话通常由一个值的散列和一个会话id (通常是32个字符的字符串)组成,以标识哈希。发送到客户端浏览器的每个cookie都包含会话id。相反,浏览器将在客户端的每个请求中将其发送到服务器。

在将对象存储在会话中之前,您应该序列化对象。

代码语言:javascript
复制
session[:info] = OpenStruct.new(first_field: 1, second_field: 'two').to_yaml

并使用

代码语言:javascript
复制
YAML.load(session[:info])

来自rails文档

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

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

在您的environment更改中

代码语言:javascript
复制
config.session_store :cookie_store

代码语言:javascript
复制
config.session_store :cache_store
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34155613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档