在UsersController #create
中的ActionDispatch :: Cookies :: CookieOverflow
我尝试打开页面时出现此错误。我不知道如何调试此错误。你对这个问题有什么建议吗?
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
答案 0 :(得分:150)
你对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现在将使用sessions表来存储会话数据, 你不会有4kb的限制。
答案 1 :(得分:71)
要使: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'
更新:
如果有人在rails 4中收到null value in column "session_id" violates not-null constraint
消息,则会有workaround in github(未经过测试)。您必须使用ActiveRecord::SessionStore::Session.attr_accessible :data, :session_id
答案 2 :(得分:10)
错误消息清楚地表明cookie存储大小溢出的问题。
您的会话(默认情况下在Cookie中)需要移至Active记录 存储或memcache存储来解决此问题。
对于数据库会话:
config.action_controller.session_store = :active_record_store
您需要创建会话表,如下所示
rake db:sessions:create
rake db:migrate
OR
对于Memcache会话:
config.action_controller.session_store = :mem_cache_store
您还需要设置mem缓存服务器并按如下所示进行配置:
config.cache_store = :mem_cache_store, 'localhost', '127.0.0.1:11211',
{:namespace => 'myapp123'}
答案 3 :(得分:9)
在会话中存储模型对象不是一个好主意。
在此主题上查看此railscast: http://railscasts.com/episodes/13-dangers-of-model-in-session?autoplay=true
在会话中存储id(在这种情况下是用户的id)是一种更好的做法。 那你就不会有这个问题了。
(见上文Frederick Cheung的评论)。
答案 4 :(得分:7)
如果你看到这个,请检查你是否没有炸毁一些会话数据。就我而言,闪存消息中输入了数千条相同的消息。只是说。
答案 5 :(得分:2)
该错误是因为您正在尝试序列化用户模型 在将对象存储在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
答案 6 :(得分:1)
当我运行规格时,这个错误出现了。将Capybara从1.x更新为2.x. 只是耙tmp:清楚解决了它。