[英]Cookie overflow in rails application?
ActionDispatch::Cookies::CookieOverflow 在 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
您可以在 cookie 中存儲的內容有 4kb 的限制,當 Rails 將您的對象轉換為文本以寫入 cookie 時,它可能會大於該限制。
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
收到null value in column "session_id" violates not-null constraint
了 rails 4 中的null value in column "session_id" violates not-null constraint
消息,則github 中有一個解決方法(未測試)。 您必須使用ActiveRecord::SessionStore::Session.attr_accessible :data, :session_id
創建初始值設定項
如果您看到這一點,請檢查您沒有破壞某些會話數據。 就我而言,它是將數千條相同的消息注入到閃現消息中。 就是說。
我要補充一點,如果您認為解決方案是讓您的 cookie 存儲更大(正如大多數其他答案所解決的那樣),那么您最好重新考慮一下您實際放入 cookie 的內容。 如果您需要多個身份驗證令牌、會話 ID 以及一些布局/跟蹤 cookie,那么您就生活在 90 年代。
在會話中存儲模型對象不是一個好主意。
查看有關此主題的 Railscast: http ://railscasts.com/episodes/13-dangers-of-model-in-session?autoplay=true
將 id(在本例中為用戶的 id)存儲在會話中是一種更好的做法。 那你就不會有這個問題了。
(另請參閱上面的 Frederick Cheung 評論)。
錯誤消息清楚地表明溢出的 cookie 存儲大小問題。
您的會話(默認在 cookie 中)需要移動到 Active record store 或 memcache store 以解決此問題。
對於數據庫會話:
config.action_controller.session_store = :active_record_store
您需要創建會話表如下
rake db:sessions:create
rake db:migrate
或者
對於 Memcache 會話:
config.action_controller.session_store = :mem_cache_store
您還需要設置一個內存緩存服務器並將其配置如下:
config.cache_store = :mem_cache_store, 'localhost', '127.0.0.1:11211',
{:namespace => 'myapp123'}
該錯誤是因為您正在嘗試序列化用戶模型在 cookie 中存儲對象時,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 后。 只是 rake tmp:clear 解決了它。
我的問題是因為代碼
rescue StandardError => e
flash[:error] = "Error was #{error.message}"
end
在error.message
太大
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.