[ruby-on-rails] Rails 애플리케이션의 쿠키 오버플로?

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



답변

쿠키에 저장할 수있는 항목에는 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 제한이 없습니다.


답변

: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


답변

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

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


답변

세션에 모델 객체를 저장하는 것은 좋은 생각이 아닙니다.

이 주제에 대한이 railscast를 확인하십시오 :
http://railscasts.com/episodes/13-dangers-of-model-in-session?autoplay=true

세션 내에 ID (이 경우 사용자 ID)를 저장하는 것이 더 좋습니다. 그러면이 문제가 발생하지 않습니다.

(위의 Frederick Cheung 주석도 참조하십시오).


답변

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

이 문제를 해결하려면 세션 (기본적으로 쿠키)을 활성 레코드 저장소 또는 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'}


답변

이 오류는 사용자 모델을 직렬화하려고하기 때문입니다. 개체를 쿠키에 저장할 때 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


답변

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