Rails 애플리케이션의 쿠키 오버플로?


106

ActionDispatch :: Cookies :: CookieOverflow in UsersController # create

페이지를 열려고 할 때이 오류가 발생합니다. 이 오류를 디버깅하는 방법을 모르겠습니다. 이 문제에 대한 제안이 있습니까?

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
이 오류는 세션에 큰 데이터 / 개체가있을 때 발생합니다. 컨트롤러에서 액션 생성을위한 코드를 공유 할 수 있습니까?
Naren Sisodiya


3
세션 저장소 변경에 대한 답변은 정확하지만 세션에 전체 사용자를 저장하려는 이유가 궁금합니다. 무언가를 저장해야하는 경우 user_id를 저장합니다 (이미 쿠키에 있음)
Frederick Cheung

브라우저 캐시 저장소로 이동하여 특정 웹 사이트 URL에 속한 쿠키를 삭제하면됩니다. 나를 위해 그것은 주로 localhost에서 발생합니다.
ben 2015 년

사용자 모델을 만들었고 Devise마이그레이션을 실행 한 후 개발 서버를 다시 시작하지 않았습니다. 한 번 오류가 중지되었습니다.
wuliwong

답변:


159

쿠키에 저장할 수있는 항목에는 4kb 제한이 있으며, 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 :cookie_store, :key => 'xxx'

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

세 단계를 완료했으면 애플리케이션을 다시 시작하십시오. Rails는 이제 세션 테이블을 사용하여 세션 데이터를 저장하며 4kb 제한이 없습니다.


1
것이 가능이 체크 아웃하는 그 쿠키를 볼 수
erogol

궁금합니다. 세션 당 4KB 제한인가요, 아니면 앱당 제한인가요?
colllin 2013

1
@colllin, 세션 당입니다.
Alex D

active_record_store보석이 필요한 가요?
Saad Masood

또는 rails4의 일부입니까
Saad Masood

78

:active_record_store기능이 Rails 4/5에서 작동 하도록하려면 activerecord-session_store gem을 다음에 추가해야 합니다 Gemfile.

gem 'activerecord-session_store'

그런 다음 마이그레이션 생성기를 실행하십시오.

rails generate active_record:session_migration
rake db:migrate

마지막으로 세션 저장소를 config/initializers/session_store.rb다음 위치에 설정하십시오 .

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

최신 정보:

null value in column "session_id" violates not-null constraint레일 4에서 메시지를 받는 사람이 있다면 github에 해결 방법이 있습니다 (테스트되지 않음). 다음을 사용하여 이니셜 라이저를 만들어야합니다.ActiveRecord::SessionStore::Session.attr_accessible :data, :session_id


이 gem을 사용할 때 오류가 발생하지 않았습니까? 나는 다음을 얻을 :ERROR: null value in column "session_id" violates not-null constraint
피터

@Peter 그것은 나에게 일어난 것이 아니지만 여기는 여전히 열린 문제로 나타납니다. 내 유일한 조언은 누군가가 수정을 할 때까지 그 문제에 대한 의견을 작성하는 것입니다. 죄송합니다 : /
Alter Lagos

@Peter 너무 늦었는지 확실하지 않지만 어쨌든 업데이트 된 답변을 확인하십시오
Alter Lagos

2
"rails generate active_record : session_migration"을 실행 한 후 "rake db : migrate"를 실행하는 것을 잊지 마십시오!
Patrice Gagnon

2
DB에 아무것도 저장하지 않으려면 어떻게하면 오류를 복구 할 수 있습니까? 나는 시도 rescue_from ActionDispatch :: 쿠키 :: CookieOverflow : 그것은 작동하지 않았다하지만와 ApplicationController에 render_404 =>로
nisevi

14

이 메시지가 표시되는 경우 일부 세션 데이터가 날리지 않는지 확인하십시오. 제 경우에는 수천 개의 동일한 메시지가 플래시 메시지로 펌핑되었습니다. 그냥 말해.

해결책이 쿠키 저장소를 더 크게 만드는 것이라고 생각한다면 (대부분의 다른 답변 주소와 같이) 실제로 쿠키에 넣는 것을 다시 생각하는 것이 좋습니다. 두 개 이상의 인증 토큰, 세션 ID 및 레이아웃 / 추적 쿠키가 필요한 경우 90 년대에 살고있는 것입니다.


1
상태를 저장하기 위해 몇 가지 매개 변수를 심층 병합했습니다!
Anwar

2
이것은 나에게도 오류의 원인이었습니다. 플래시 메시지에 너무 많은 데이터를 넣습니다.
knubie


9

오류 메시지는 오버플로 인 쿠키 저장소 크기 문제를 명확하게 나타냅니다.

이 문제를 해결하려면 세션 (기본적으로 쿠키)을 활성 레코드 저장소 또는 Memcache 저장소로 이동해야합니다.

데이터베이스 세션의 경우 :

config.action_controller.session_store = :active_record_store

아래와 같이 세션 테이블을 생성해야합니다.

rake db:sessions:create
rake db:migrate

또는

Memcache 세션의 경우 :

config.action_controller.session_store = :mem_cache_store

또한 mem 캐시 서버를 설정하고 아래와 같이 구성해야합니다.

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

6

이 오류는 사용자 모델을 직렬화하려고하기 때문입니다. 개체를 쿠키에 저장할 때 RailsMarshal.dump 를 사용 하여 사용자 레코드의 모든 것이기 때문에 많은 양의 콘텐츠를 생성 할 수 있습니다.

실제 사용자 레코드를 저장하는 대신 session[:current_user] = user사용자의 ID를 저장하는 방법으로 사용자를 조회하는 방법이 있습니다.

def sign_in(user)
  ...
  session[:current_user_id] = user.id
end

def current_user
  @current_user ||= User.find(session[:current_user_id])
end

1

이 오류는 사양을 실행할 때 나에게 나타났습니다. Capybara를 1.x에서 2.x로 업데이트 한 후. 그냥 레이크 tmp : clear가 해결했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.