2012-02-27 13 views
84

ActionDispatch::Cookies::CookieOverflow in UsersController#createPrzepełnienie plików cookie w aplikacjach szyn?

Mam ten błąd, gdy próbuję otworzyć stronę. Nie wiem, jak debugować ten błąd. Czy masz jakieś sugestie dotyczące tego problemu?

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

ten błąd pojawia się, gdy w sesji znajduje się duże dane/obiekt. Czy możesz udostępnić kod akcji tworzenia w kontrolerze? –

+1

Duplikat http://stackoverflow.com/questions/4782611/rails-how-to-save-a-big-array-in-session-actiondispatchcookiescookieoverf? – iblue

+0

Czy możesz wkleić zrzut sesji? –

Odpowiedz

138

Masz limit 4KB na to, co można zapisać w pliku cookie, a gdy Rails konwertuje obiekt do tekstu na piśmie do cookie jej prawdopodobnie większy niż limit.

Ruby on Rails ActionDispatch::Cookies::CookieOverflow błąd

ten sposób to CookieOverflow Błąd występuje.

Najprostszym sposobem rozwiązania tego problemu jest zmiana punktu sesji i nieużywanie cookie_store. Możesz użyć przykładu active_record_store.

Oto kroki

  1. Generowanie migracji, która tworzy tabeli sesji

    rake db:sessions:create 
    
  2. uruchomić migrację

    rake db:migrate 
    
  3. Modyfikuj config/initializers/session_store.rb z

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

    do

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

Po wykonaniu trzech kroków, uruchom ponownie aplikację. Railsy będą teraz używać tabeli sesji do przechowywania danych sesji, i nie będziesz miał limitu 4kb.

+1

jest to możliwe, aby zobaczyć to ciasteczko, aby to sprawdzić – erogol

+0

<% = debug (@user)%> –

+0

@Erogol - Zobacz, czy edytuję odpowiedź –

9

komunikat o błędzie wyraźnie wskazuje na problem z przekroczeniem rozmiaru magazynu cookie.

Twoje sesje (domyślnie w ciasteczku) muszą zostać przeniesione do rekordu aktywnego sklepu lub magazynu memcache, aby rozwiązać ten problem.

Dla sesji Databased:

config.action_controller.session_store = :active_record_store 

Trzeba utworzyć tabelę sesji poniżej

rake db:sessions:create 
rake db:migrate 

LUB

Dla Memcache sesji:

config.action_controller.session_store = :mem_cache_store 

Również NE Aby skonfigurować serwer pamięci podręcznej pamięci i skonfigurować go jak poniżej:

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

Ten błąd pojawił się, gdy wyświetlałem specyfikację. Po aktualizacji Capybara z 1.x do 2.x. Tylko prowizja tmp: wyczyść to.

68

Aby dokonać :active_record_store prace funkcjonalność w Rails 4/5, należy dodać activerecord-session_store gem do Gemfile:

gem 'activerecord-session_store' 

następnie uruchomić generator migracji:

rails generate active_record:session_migration 
rake db:migrate 

I wreszcie ustawić swój sklep sesji w config/initializers/session_store.rb:

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

UPDATE:

Jeśli ktoś odbiera null value in column "session_id" violates not-null constraint post w szynach 4, istnieje workaround in github (nie testowane). Konieczne jest utworzenie inicjalizatora z ActiveRecord::SessionStore::Session.attr_accessible :data, :session_id

+0

Czy nie dostałeś błędu podczas używania tego klejnotu? Otrzymuję następujące polecenie: 'BŁĄD: wartość pusta w kolumnie" identyfikator_sesji "narusza niezerowe ograniczenie ' – Peter

+0

@Peter To mi się nie zdarzyło, ale [tutaj] (https: // github.com/rails/activerecord-session_store/issues/6) nadal pojawia się jako problem otwarty. Moją jedyną radą jest napisanie komentarza w tym numerze, aby obejrzeć go, dopóki ktoś nie poprawi. Przepraszamy:/ –

+0

@Peter Nie jestem pewien, czy jest za późno, ale mimo to sprawdź moją zaktualizowaną odpowiedź –

2

Jeśli to widzisz, sprawdź, czy nie wysyłasz danych sesji. W moim przypadku do wiadomości flash wpompowano tysiące takich samych wiadomości. Tylko mówię.

+1

Głęboko scalałem niektóre paramety, aby zapisać stan! – Anwar

+1

To również było przyczyną błędu. Umieszczanie zbyt dużej ilości danych w wiadomości flash. – knubie

Powiązane problemy