Rails 会话中存储的对象变成了字符串?

2024-04-14

通常我不会在 Rails 会话中存储对象,但我正在使用需要此功能的库。我遇到了一个非常奇怪的问题,其中存储的对象在重定向后显示为字符串。

为了重现,我创建了一个示例 Rails 4.1 应用程序

$ rails new session-test

添加了测试控制器:

class HomeController < ApplicationController
  def index
    logger.debug "session[:customer]: #{session[:customer]}"
    logger.debug "session[:customer].name: #{session[:customer].name}"
  end

  def from
    Struct.new 'Customer', :name, :address
    session[:customer] = Struct::Customer.new 'Dave', '123 Main'
    redirect_to :action => :index
  end
end

设置路线:

Rails.application.routes.draw do
  get 'home/index'
  get 'home/from'
  root 'home#index'
end

然后我启动 Rails

$ bundle exec rails server

并在浏览器中点击 localhost:3000/home/from :

Started GET "/home/from" for 127.0.0.1 at 2014-04-09 21:20:25 -0700
Processing by HomeController#from as HTML
Redirected to http://localhost:3000/home/index
Completed 302 Found in 18ms (ActiveRecord: 0.0ms)


Started GET "/home/index" for 127.0.0.1 at 2014-04-09 21:20:25 -0700
Processing by HomeController#index as HTML
session[:customer]: #<struct Struct::Customer name="Dave", address="123 Main">
Completed 500 Internal Server Error in 2ms

NoMethodError (undefined method `name' for "#<struct Struct::Customer name=\"Dave\", address=\"123 Main\">":String):
  app/controllers/home_controller.rb:4:in `index'

我不知道为什么这个对象被翻译为字符串......

这似乎与 cookie_store 的会话存储类型有关,因为如果我改变

session_store.rb 来自

Rails.application.config.session_store :cookie_store, key: '_session-test_session'

to

Rails.application.config.session_store :cache_store

有用!

有任何想法吗?


您无法在 Rails 会话中存储对象。它是一个只接受字符串的键值存储,因为它通常会被打包并作为加密的 cookie 发送到客户端。

这不是您可能需要的东西的垃圾场。请注意您在其中塞入了多少垃圾,因为您对会话的依赖越多,cookie 就越大,客户端必须为每个请求返回到您的服务器。

值得观察浏览器网络检查工具中的标头,以了解您的请求所占用的空间有多大。

如果您确实需要在其中保留某些内容,请使用字符串友好的编码格式(例如 JSON),以确保您可以以可用的格式获取数据。

我会非常犹豫是否使用cache_store同样,它不会在应用程序的不同实例之间共享。 Ruby 对象仅存在于单个进程的上下文中,因此其他请求(通常会遇到一些随机进程)将无法轻松地使用它。

默认的 cookie 存储是最可靠的。进程之间共享的其他服务依赖于正在运行的其他服务(Memcached、Redis 等),但其中大多数也规定了仅字符串策略。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 会话中存储的对象变成了字符串? 的相关文章

  • 如何加载页面特定的rails 4 js文件?

    我正在阅读资产管道的 Rails 指南文档 它指出 CoffeeScript 页面特定生成的文件 如果清单上有 require tree 指令 则默认情况下可供用户使用 这对我不起作用我必须包括这个 在特定控制器上 我缺少什么 资产管道会将
  • Ruby/Rails 集合到集合

    我有两个表与一个连接表连接 这只是伪代码 Library Book LibraryBooks 我需要做的是 如果我有一个图书馆的 id 我想获取该图书馆拥有的所有书籍所在的所有图书馆 因此 如果我有图书馆 1 图书馆 1 中有书籍 A 和
  • 上游太大 - nginx + codeigniter

    我从 Nginx 收到此错误 但似乎无法弄清楚 我正在使用 codeigniter 并使用数据库进行会话 所以我想知道标题怎么会太大 有没有办法检查标题是什么 或者看看我能做些什么来修复这个错误 如果您需要我提供任何conf文件或其他文件
  • 如何处理 AJAX 请求中的会话超时

    我相信你们都熟悉使用 AJAX 的投票系统 嗯 看那边 我有类似的东西 当你投票赞成或反对时 它使用 AJAX 从 votes php 请求新值 问题是我正在使用会话来获取用户 ID 因此一个人只能投票一次 如果他们在页面上坐了一个小时然后
  • 显式删除会话cookie会产生什么影响?

    我使用 php session 来维护用户的会话 Session 在登录后创建 在注销或超时后销毁 我需要管理面板中的一个选项来强制注销任何用户 如果他在网站上处于活动状态 我怎样才能做到这一点 我正在考虑删除临时会话文件 这应该有效地破坏
  • 为 RoR 中的每个用户创建新的 URL 路径

    如何在 Ruby on Rails 中实时创建新的 URL 路径 例如 我希望我的用户拥有 name XXX com 或 XXX com name 仅供参考 我在 Heroku 上托管代码 看看 subdomain fu 插件 https
  • 在 Sinatra 中运行后台进程

    我有 Sinatra Rails 应用程序和一个启动一些漫长过程的操作 通常我会为后台作业排队 但这种情况太简单了 后台进程很少启动 所以队列是一个开销 那么如何在没有队列的情况下运行后台进程呢 get build logs project
  • Rails 3:如何让用户在表单中至少选择一个复选框?

    我有一个表单 用户在提交表单之前必须选中至少一个复选框 有没有任何插件可以处理这个问题或者jquery可以应用于我的表单 不幸的是我完全是一个 jquery 菜鸟 上面的所有答案都显示了如何在客户端执行此操作 这确实可能更好 正如您的问题标
  • 带有 git Remote 的 Gem 文件在 Heroku 推送上失败

    我的 gemfile 中有以下行 gem client side validations git gt email protected cdn cgi l email protection Dakuan client side valida
  • ruby on Rails:音频/mp3 内容标题下载

    如何在 ruby rails 中设置下载标题 在 php 中 我为 mp3 下载设置标头 如下所示 header Content Transfer Encoding binary header Content type audio mp3
  • 嵌套 has_one 关联的强参数

    我似乎遗漏了一些明显的东西 但我无法允许嵌套的属性has one协会 控制器 def create crossword Crossword new crossword params if crossword save render show
  • Rails 选择帮助程序中的 :include_blank 和 :prompt 有什么区别?

    在 Rails 文档中 http api rubyonrails org classes ActionView Helpers FormOptionsHelper html label Options 前两个列出的选项select帮手是 i
  • 即使路由存在,Rspec 命名空间路由规范也会失败

    我在用着rspec rails 2 8 1 and 导轨3 1 3 我正在尝试测试 Admin ZonesController 的路由 我已经通过运行验证了浏览器中存在该路由rake routes 我没有使用 ActiveRecord 如果
  • PHP 的脚手架 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 PHP 中有什么东西可以像 Rails 一样创建基本的脚手架吗 编辑 我需要一些东西来快速原型化 一些框架比如Symfony http www sym
  • Spring Boot,Websockets无法从Session获取用户(即java.security.Principal)

    与 一起工作Spring Boot 1 2 1 RELEASE and Spring Websockets 运行嵌入式时存在部署运行时问题Jetty 9 我不能伪造用户 java security Principal 当应用程序部署在本地主
  • 如何在Rails中使用jquery tokeninput?

    我正在尝试在我的应用程序的表单中添加 tokeninput jquery 字段 该字段允许用户发布状态更新 我希望用户能够将作品 单独的模型 附加到状态更新中 我正在使用 act as taggable on gem 并且我的查询指定标签上
  • MVP - 演示者应该使用 Session 吗?

    我正在为网页使用模型 视图 演示者模式 演示者应该知道会话还是应该只有视图知道它 我想我的意思是像会话这样的概念与视图的体系结构非常相关 所以它们应该仅限于视图使用吗 否则 如果我想在不同架构的类似页面上重用演示者 会发生什么 或者我不需要
  • 如何在实际作业中引用活动的delayed_job

    我正在研究一个解决方案来显示延迟作业的完成百分比 使用delayed job gem 目前 我的delayed jobs 表的数据库迁移如下所示 class CreateDelayedJobs lt ActiveRecord Migrati
  • 如何对 JSON 类型列进行分组/选择(PG::UndefinedFunction: 错误: 无法识别 json 类型的等式运算符)

    我想做
  • 文件位置 Rails 7 中的 Javascript 与样式表

    在使用导入映射功能的新默认 Rails 7 应用程序中 Javascript 存储在app javascript 而 CSS 位于app assets stylesheets 它们不仅位于不同的层次结构级别 而且javascript是奇异的

随机推荐

  • 如果 OSX/iOS 中的网络代理设置发生更改,是否有办法接收通知/回调?

    如果 OSX iOS C C 或 Objective C 中的网络代理设置发生更改 我想收到通知 回调吗 有人有关于如何执行此操作的示例吗 监控系统配置SCDynamicStoreSetNotificationKeys 对于您需要注意的按键
  • 打开解析推送通知时出现异常[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 I setup 解析推送Android SDK 1 7 0 https parse com docs android g
  • 在 Spring 的 RequestMapping 中,{parameter:.+} 与 {parameter} 有什么不同吗?

    我正在查看一些使用 RequestMapping 的 Spring 代码 如下所示 RequestMapping foo bar 这在功能上与以下有什么不同吗 RequestMapping foo bar 据我所知 RegExp 始终应用于
  • 给定最大成本,找到具有最小成本和最大长度的路径

    我正在寻找一种算法 以在无向加权完整图中给定最大成本的情况下找到具有最小成本和最大长度的两个节点之间的路径 权重非负 就我现在而言 我正在使用 DFS 而且它非常慢 节点数量较多 长度也最大 我已经在 DFS 的每次迭代中丢弃了所有不可能的
  • 以编程方式设置文本时,如何避免出现自动完成下拉列表?

    我的布局中有一个 AutoCompleteTextView 我还有另一种方法来选择 AutoCompleteTextView 中存在的相同项目 当选择替代方式时 我通过以下方式填充 AutoCompleteTextView 中的值 auto
  • 如何在QT中发送和接收UDP数据包

    我正在 QT 中编写一个小型应用程序 它通过本地网络发送广播 UDP 数据包 并等待来自网络上的一个或多个设备的 UDP 响应数据包 创建套接字并发送广播数据包 udpSocketSend new QUdpSocket this udpSo
  • 使用 iTextSharp 压缩 PDF [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在尝试重新压缩已创建的pdf 我正在尝试找到一种方法来重新压缩文档中的图像 以减小文件大小 我一直在尝试使用 DataLogi
  • Android Studio:编译器发生异常(1.8.0_242-release)

    运行应用程序时 无法完成编译 继续抛出错误 我安装了jdk并添加了java home路径 但仍然出现此错误 另外 当我写 flutter doctor v 时我没有任何问题 请通过 Java 错误报告页面 http bugreport ja
  • 从 AOSP master 切换到 froyo

    我刚刚用 repo 检查了 master 现在我想改用froyo 我怎样才能做到这一点而不需要再次下载一堆东西 我不想再次下载一堆东西 我只是希望能够像普通的 git 克隆一样在分支之间自由移动 由于您使用 repo 下载了所有内容 因此您
  • 迭代 EnumMap#entrySet

    枚举结束Map entrySet对于所有 Map 实现 特别是 EnumMap 不能按预期工作 IdentityHashMap这是 Josh Bloch 的示例代码谜题演示 谜题 5 http strangeloop2010 com sys
  • 一次热编码期间出现 RunTimeError

    我有一个数据集 其中类值以 1 步从 2 到 2 i e 2 1 0 1 2 其中 9 标识未标记的数据 使用一种热编码 self one hot encode labels 我收到以下错误 RuntimeError index 1 is
  • Python:第二个for循环未运行

    scores surfers results f open results txt for each line in results f name score each line split scores append float scor
  • __attribute__ 是否适用于声明中的所有变量?

    是否 attribute 指令适用于在一行中声明的所有成员 int a b c 声明三个 int 变量 int a b c 将变量 a 声明为 int 指针 将 b 和 c 声明为 int int attribute used a b c
  • 如何检测 firebase firestore 数据库中的实时侦听器错误?

    火库听众 https firebase google com docs firestore query data listen将在一段时间后随机关闭 可能是由于不活动 并且在 python 中没有简单的方法来捕获它们抛出的错误 因为它们将它
  • 我需要 T-SQL 中的国家/地区列表

    我有一个国家 地区表 其中包含国家 地区名称列 我需要 DDL 中现成的列表来填充 CountryName 列 该表驻留在 SQL Server 2008 中 你可以尝试这个脚本 CREATE TABLE tbl Countries Cou
  • 使用 D3.js 单击切换图例时重绘堆栈条形图

    我想使用 D3 js 实现带有切换图例的堆栈栏 单击图例时 堆栈栏应重新绘制 如果图例处于活动状态 则与图例对应的矩形板应消失 反之亦然 单击图例时 我无法正确更新与组元素和组元素内存在的矩形元素绑定的数据 在 DOM 树中 单击图例 矩形
  • c# protobuf-net反序列化时某些属性值始终为-1

    在我没有注意到这一点之前 我不确定这个问题是否是错误 或者只是这个 我创建一个Document类并声明 protobuf net 限制 ProtoContract public class Document ProtoMember 1 pr
  • 打开本地项目钥匙串?

    有谁知道如何打开本地物品钥匙串 小牛队的新功能 SecKeychainOpen 我希望能够请求用户允许使用该钥匙串中的某些条目进行访问SecKeychainFindInternetPassword 例如对于您调用的系统钥匙串SecKeych
  • 如何使用“typedef NS_ENUM”在一个 .h 文件中定义多个变量类型

    我用过typedef NS ENUM重新组织旧代码中的数据常量 使用方法在这里找到 https stackoverflow com a 42009056 2348597 every typedef被声明在一个单一的 h可以导入到项目中任何类
  • Rails 会话中存储的对象变成了字符串?

    通常我不会在 Rails 会话中存储对象 但我正在使用需要此功能的库 我遇到了一个非常奇怪的问题 其中存储的对象在重定向后显示为字符串 为了重现 我创建了一个示例 Rails 4 1 应用程序 rails new session test