2012-02-27 6 views
84

ActionDispatch::Cookies::CookieOverflow in UsersController#createレールアプリケーションでCookieがオーバーフローしますか?

ページを開こうとするとこのエラーが発生します。私はこのエラーをデバッグする方法を知らない。あなたはこの問題について何か提案していますか?

def create 
    @user = User.new(params[:user]) 
    sign_in @user 

    if @user.save 
    @user.folders.create(:folder_name=>"Default Folder", :user_id=>@user.id) 
    flash[:success] = "Welcome to Bunch<it>! " 
    redirect_to @user 
    else 
    @title = "Sign up" 
    render 'new' 
    end 
end 


def sign_in(user) 
    cookies.permanent.signed[:remember_token] = [user.id, user.salt] 
    session[:current_user] = user 
    current_user = user 
end 
+1

このエラーは、セッション中に大きなデータ/オブジェクトがある場合に発生します。コントローラーでアクションを作成するためのコードを共有できますか? –

+1

http://stackoverflow.com/questions/4782611/rails-how-to-save-a-big-array-in-session-actiondispatchcookiescookieoverfの重複はありますか? – iblue

+0

セッションダンプを貼り付けることはできますか? –

答えて

138

あなたはクッキーに保存することができますどのように4キロバイトの制限を持っている、とRailsはクッキーにその制限よりもそのおそらく大きなを書くためのテキストにあなたのオブジェクトを変換するとき。

のRuby on RailsのActionDispatch::Cookies::CookieOverflowエラー

このCookieOverflowエラーが発生するこの方法。

これを解決する最も簡単な方法は、session_storeを変更する必要があります。cookie_storeを使用しないでください。例としてactive_record_storeを使用できます。ここで

はステップ

  1. からセッションテーブルを作成し、移行

    rake db:sessions:create 
    
  2. 実行移行

    rake db:migrate 
    
  3. 修正config/initializers/session_store.rbを生成しています

    (App)::Application.config.session_store :active_record_store 
    

から

(App)::Application.config.session_store :cookie_store, :key => 'xxx' 

あなたは3つの手順を完了したら、アプリケーションを再起動してください。 Railsはセッションテーブルを使用してセッションデータを保存します( )、4kbの制限はありません。

+1

これをチェックするために、そのクッキーを見ることが可能です – erogol

+0

<%= debug(@user)%> –

+0

@Erogol - 答えを編集しますか? –

9

エラーメッセージは、オーバーフローしているCookieストアサイズの問題を明確に示しています。

この問題を解決するには、セッション(デフォルトではCookie内)をアクティブレコード ストアまたはmemcacheストアに移動する必要があります。データベース化セッションでは

config.action_controller.session_store = :active_record_store 

あなたは以下のようにセッションテーブルを作成する必要がMemcacheのセッションでは

rake db:sessions:create 
rake db:migrate 

OR

:また

config.action_controller.session_store = :mem_cache_store 

あなたがNE mem cache serverを設定し、以下のように設定してください:

config.cache_store = :mem_cache_store, 'localhost', '127.0.0.1:11211', 
{:namespace => 'myapp123'} 
9

セッションにモデルオブジェクトを保存することはお勧めできません。

は、このトピックにこのrailscastをチェックアウト: http://railscasts.com/episodes/13-dangers-of-model-in-session?autoplay=true

それは、セッション内のid(この場合は、ユーザーのID)を格納するためのより良いプラクティスです。 この問題は発生しません。

(上記のFrederick Cheungのコメントも参照してください)。

1

このエラーは、私が仕様を実行しているときに表示されました。 Capybaraを1.xから2.xにアップデートした後。 ちょうどrake tmp:それを解決しました。 :active_record_store機能がRailsの4/5で動作し、あなたのGemfileactiverecord-session_store宝石を追加する必要がありますようにするに

68

gem 'activerecord-session_store' 

、移行ジェネレータを実行します。

rails generate active_record:session_migration 
rake db:migrate 

そして最後には、あなたの設定セッションストアin config/initializers/session_store.rb

Rails.application.config.session_store :active_record_store, :key => '_my_app_session' 

UPDATE:誰もがレール4にnull value in column "session_id" violates not-null constraintメッセージを受信して​​いる場合

、(テストしていません)workaround in githubがあります。 ActiveRecord::SessionStore::Session.attr_accessible :data, :session_id

+0

この宝石を使用する際にエラーはありませんでしたか?私は次のようになります: 'ERROR:列のnull値session_idがnullでない制約に違反しました。 ' – Peter

+0

@Peterそれは私には起こりませんでしたが、[ここ](https:// github。com/rails/activerecord-session_store/issues/6)はまだ開いている問題として表示されます。私の唯一のアドバイスは、誰かが修正を加えるまでそれを見るためにその問題にコメントを書いていることです。申し訳ありません:/ –

+0

@Peter遅すぎるかどうかわかりませんが、とにかく更新された回答を確認してください –

2

で初期化子を作成する必要があります。表示されている場合は、セッションデータが壊れていないことを確認してください。私の場合、それは何千もの同じメッセージがフラッシュメッセージにポンピングされました。ただ言って。

+1

状態を保存するためにいくつかのパラメータを深くマージしました! – Anwar

+1

これも私のためのエラーの原因でした。フラッシュメッセージにあまりにも多くのデータを置く。 – knubie

関連する問題