2012-12-13 20 views
10

私は私のRailsアプリケーションはTypeError:

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

たぶん関連から

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

答えて

2

この値は何ですか。それは複雑な目的ですか?アクティブなレコードのインスタンスかもしれない?

私はFourSquareクライアントオブジェクトをセッションに入れようとしても同じ問題がありました。 セッションから復旧する代わりに、毎回新しいインスタンスを作成するように変更しました。うまくいきました。

4

あなたのvalueはProcであるか、Procの内部に入れられています。 Procsとlambdaはクロージャであるため、シリアル化/マーシャリング/ダンプすることはできません。クロージャは、作成時にメモリ内にあるものに依存するため、後で正しくシリアル化できません。

this answerを参照してください。

私は自分の場合に何をしているのか分かりませんが、Procsに頼らずに自分の仕事を達成する方法を見つけなければならないようです。

0

enable :sessionsの代わりにuse Rack::Session::Poolとお考えですか? Rack::Sessions::Poolは、シリアル化できないオブジェクトのローカルストレージを可能にし、IDをクッキー内のオブジェクトに格納して検索することができます。

私は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