2012-12-13 28 views
10

Ich versuche, einen Wert in der Sitzung zu speichern, den Code unten in meiner Rails-Anwendung mitTypeerror (kein _dump_data für Klasse Proc definiert ist):

session[:key] = value 

und ich erhalte die folgenden Fehler

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 ` 

Jede Hilfe wird sehr geschätzt.

+0

Vielleicht relevant: http://stackoverflow.com/questions/4668030/how-to-resolve-marshal-dump-no-marshal-dump-is-defined-for-class -proc-Fehler –

Antwort

2

Was ist dieser Wert? Ist es ein kompliziertes Objekt? Eine aktive Record Instanz vielleicht?

Ich hatte das gleiche Problem beim Versuch, ein FourSquare-Client-Objekt in die Sitzung zu setzen. Ich habe geändert, um jedes Mal eine neue Instanz zu erstellen, anstatt von der Sitzung wiederherzustellen, und es hat funktioniert.

4

Ihre value ist entweder ein Proc oder hat s proc geschachtelt irgendwo drin. Procs und Lambdas können nicht serialisiert/gemahnt/gelöscht werden, weil sie Verschlüsse sind. Closures hängen davon ab, was zum Zeitpunkt ihrer Erstellung im Speicher ist, und können daher später nicht korrekt deserialisiert werden.

Siehe this answer.

Ich bin mir nicht sicher, was ich in meinem Fall tun werde, es sieht so aus, als müsste ich einen Weg finden, meine Aufgabe zu erfüllen, ohne mich auf Procs zu verlassen.

0

Haben Sie use Rack::Session::Pool anstelle von plain enable :sessions betrachtet? Rack::Sessions::Pool ermöglicht die lokale Speicherung von unserialisierbaren Objekten, während die ID im Cookie im Objekt gespeichert wird, damit sie abgerufen werden kann.

Ich benutzte es, um eine (n) (unsisalisierbare) Datenbankverbindung über Sinatra-Routen beizubehalten.

Von 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 
Verwandte Themen