我正在尝试使用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 `
非常感谢任何帮助。
答案 0 :(得分:7)
你的value
要么是Proc,要么已经在其中嵌入了Proc。 Procs和lambdas不能被序列化/编组/转储,因为它们是闭包。闭包取决于创建时内存中的内容,因此以后无法正确反序列化。
请参阅this answer。
我不确定在我的情况下我会做什么,看起来我必须找到一种方法来完成我的任务,而不依赖于Procs。
答案 1 :(得分:2)
这个值是多少?这是一个复杂的对象吗?一个活跃的记录实例可能?
我在尝试将FourSquare客户端对象放入会话时遇到了同样的问题。 我已经改为每次都创建一个新实例,而不是从会话中恢复,它运行正常。
答案 2 :(得分:0)
您是否考虑过use Rack::Session::Pool
而不是enable :sessions
? Rack::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 函数的 @ 变量。这就是问题所在。