11

我正在尝试在我的 rails 应用程序中使用以下代码在会话中存储一个值

session[:key] = value 

我收到以下错误

TypeError (no _dump_data is defined for class Proc):
activesupport (3.2.9) lib/active_support/message_verifier.rb:53:in `dump'
 activesupport (3.2.9) lib/active_support/message_verifier.rb:53:in `generate'
 actionpack (3.2.9) lib/action_dispatch/middleware/cookies.rb:300:in `[]='
actionpack (3.2.9) lib/action_dispatch/middleware/session/cookie_store.rb:67:in    `set_cookie'
rack (1.4.1) lib/rack/session/abstract/id.rb:330:in `commit_session'
rack (1.4.1) lib/rack/session/abstract/id.rb:206:in `context'
rack (1.4.1) lib/rack/session/abstract/id.rb:200:in `call'
actionpack (3.2.9) lib/action_dispatch/middleware/cookies.rb:341:in `call'
activerecord (3.2.9) lib/active_record/query_cache.rb:64:in `call'
activerecord (3.2.9)    lib/active_record/connection_adapters/abstract/connection_pool.rb:479:in `call'
actionpack (3.2.9) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
activesupport (3.2.9) lib/active_support/callbacks.rb:405:in `

非常感谢任何帮助。

4

4 回答 4

6

value要么是一个 Proc,要么是在某个地方嵌套了 s Proc。Procs 和 lambdas 不能被序列化/编组/转储,因为它们是闭包。闭包取决于创建它们时内存中的内容,因此以后无法正确反序列化。

看到这个答案

我不确定在我的情况下我会做什么,看起来我必须想办法在不依赖 Procs 的情况下完成我的任务。

于 2015-02-26T16:14:19.913 回答
2

这个值是多少?它是一个复杂的对象吗?一个活动的记录实例可能吗?

我在尝试将 FourSquare 客户端对象放入会话时遇到了同样的问题。我已经更改为每次都创建一个新实例,而不是从会话中恢复,它工作正常。

于 2013-01-16T01:03:36.510 回答
1

在我的例子中,我们正在缓存一个 ActiveRecord 模型,并且该模型有一个包含 lambda 函数的 @ 变量。那是造成问题的原因。

于 2021-03-17T15:43:42.070 回答
0

你有没有考虑过use Rack::Session::Pool而不是平原enable :sessionsRack::Sessions::Pool允许本地存储不可序列化的对象,同时将对象的 ID 存储在 cookie 中以便可以检索它。

我用它来跨 Sinatra 路由保留一个(n)(不可序列化的)数据库连接。

来自http://www.getlaura.com/how-to-enable-sessions-with-sinatra/

require 'sinatra/base'
require 'customer.rb'

class SinatraApp < Sinatra::Base

use Rack::Session::Pool

get '/welcome' do
  name = session[:customer].name
  "Hello, #{name}!"
end

post '/:name' do
  session[:customer] = Customer.new(params[:name])
  redirect '/welcome'
end
end
于 2017-09-25T01:05:11.037 回答