TypeError(没有为类Proc定义_dump_data):

时间:2012-12-13 14:06:06

标签: ruby-on-rails ruby-on-rails-3

我正在尝试使用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 个答案:

答案 0 :(得分:7)

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

请参阅this answer

我不确定在我的情况下我会做什么,看起来我必须找到一种方法来完成我的任务,而不依赖于Procs。

答案 1 :(得分:2)

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

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

答案 2 :(得分: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

答案 3 :(得分:0)

在我的例子中,我们缓存了一个 ActiveRecord 模型,该模型有一个包含 lambda 函数的 @ 变量。这就是问题所在。