[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
예를 들어 사용할 수 있습니다 .
단계는 다음과 같습니다.
-
세션 테이블을 생성하는 마이그레이션 생성
rake db:sessions:create
-
마이그레이션 실행
rake db:migrate
-
수정
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'}
답변
이 오류는 사용자 모델을 직렬화하려고하기 때문입니다. 개체를 쿠키에 저장할 때 Rails 는 Marshal.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가 해결했습니다.