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