TypeError (no_dump_data определен для класса Proc):
Я пытаюсь сохранить значение в сеансе, используя приведенный ниже код в приложении 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 `
Любая помощь приветствуется.
Ответы
Ответ 1
Ваш value
является либо Proc, либо имеет s Proc, где-то внутри него. Procs и lambdas не могут быть сериализованы/маршалированы/сброшены, потому что они закрыты. Замки зависят от того, что находится в памяти в момент их создания, и поэтому не могут быть впоследствии неэтериализованы.
См. этот ответ.
Я не уверен, что я буду делать в моем случае, похоже, мне нужно будет найти способ выполнить мою задачу, не полагаясь на Procs.
Ответ 2
Что это за значение? Это сложный объект? Может быть, активный экземпляр записи?
У меня была та же проблема, что и попытка включить в сеанс клиентский объект FourSquare.
Я изменил для создания нового экземпляра каждый раз, вместо восстановления после сеанса, и он работал нормально.
Ответ 3
Вы считали use Rack::Session::Pool
вместо простого enable :sessions
? Rack::Sessions::Pool
позволяет локально хранить несериализуемые объекты, сохраняя идентификатор объекта в файле cookie, чтобы его можно было найти.
Я использовал его для сохранения соединения (n) (несериализуемого) базы данных по маршрутам Sinatra.
От 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