117

操作调度::Cookies::Cookie用户控制器#create中溢出

当我试图打开页面时,出现了这个错误。我不知道如何调试这个错误。你对这个问题有什么建议吗?

定义创建@user=user.new(params[:user])sign_in@user如果@user.save@user.folders.create(:folder_name=>“默认文件夹”,:user_id=>@user.id)flash[:success]=“欢迎加入Bunch<it>!”重定向到@用户其他的@title=“注册”呈现“新”结束结束定义sign_in(用户)cookies.persistent.signed[:remember_token]=[user.id,user.salt]session[:current_user]=用户current_user=用户结束
5
  • 1
    当会话中有大型数据/对象时,就会出现此错误。你能在控制器中共享创建动作的代码吗? 评论 2012年2月27日23:12
  • 1
    的副本stackoverflow.com/questions/4782611/…?
    – 伊布鲁
    评论 2012年2月27日23:27
  • 虽然关于更改会话存储的答案是正确的,但我想问一下为什么要在会话中存储整个用户。如果必须存储某些内容,请存储user_id(尽管它已经在cookie中) 评论 2012年2月28日17:50
  • 只需访问浏览器缓存存储,并清除属于该特定网站url的cookie。对我来说,这主要发生在localhost。
    – 
    评论 2015年3月30日12:51
  • 我创建了一个用户模型设计运行迁移后,我没有重新启动开发服务器。一旦我这样做了,错误就停止了。
    – 五里王
    评论 2017年8月28日22:50

8个答案8

重置为默认值
169

您对cookie中可以存储的内容有4kb的限制,当Rails将您的对象转换为用于写入cookie的文本时,可能会超过这个限制。

Rails上的Ruby操作调度::Cookies::CookieOverflow错误

就是这样Cookie溢出出现错误。

解决这个问题最简单的方法是,您需要更改session_store,并且不要使用厨师_商店。您可以使用活动记录存储以身作则。

以下是步骤

  1. 生成创建会话表的迁移

    rake数据库:会话:创建
  2. 运行迁移

    rake数据库:迁移
  3. 修改配置/初始值设定项/会话存储.rb

    (应用程序)::Application.config.session_store:cookie_store,:key=>'xxx'

    (应用程序)::Application.config.session_store:活动记录存储

完成三个步骤后,重新启动应用程序。Rails现在将使用sessions表存储会话数据,你不会有4kb的限制。

8
  • 2
    有可能看到那块饼干来看看这个吗 评论 2012年2月28日10:47
  • 只是好奇&这是每个会话或每个应用程序的4kb限制吗?
    – 夹头
    评论 2013年2月5日20:53
  • 1
    @科林,这是每节课。 评论 2013年6月1日20:30
  • 我需要这个吗活动记录存储宝石? 评论 2013年12月24日21:18
  • 1
    我建议在会话中少存储信息,而不是更改会话的存储机制。参见@cianmce的建议 评论 2019年8月16日21:23
84

要使:活动记录存储功能在Rails 4/5中工作,您必须添加活动记录会话存储给你的宝石宝石文件:

gem“activerecord-session_store”

然后运行迁移生成器:

rails生成active_record:session_migrationrake数据库:移植

最后在中设置会话存储配置/初始值设定项/会话存储.rb:

Rails.application.config.session_store:活动记录存储,:key=>“_my_app_session”

更新:

如果有人收到列“sessionid”中的null值违反了not-null约束rails 4中的消息,有一个github中的解决方案(未测试)。必须使用创建初始值设定项ActiveRecord::SessionStore::Seession.attr_accessible:数据,:Session_id

5
  • 你使用这个宝石时没有出错吗?我得到了以下信息:错误:列“session_id”中的null值违反了not-null约束
    – 彼得
    评论 2013年9月6日9:08
  • @Peter我没有,但是在这里仍然是一个悬而未决的问题。我唯一的建议是在那个问题上写一条评论,然后再看,直到有人解决为止。对不起:/ 评论 2013年9月6日14:26
  • @Peter我不确定是否太迟了,但无论如何检查一下我更新的答案 评论 2013年11月13日16:00
  • 2
    在运行“rails generate active_record:session_migration”之后,不要忘记运行:“rake db:migrate”! 评论 2014年5月21日15:33
  • 2
    如果我不想在数据库中存储任何内容,我该如何修复错误?我在ApplicationController中尝试了rescue_from ActionDispatch::Cookies::CookeeOverflow,:with=>:render_404,但没有成功
    – 尼塞维
    评论 2015年7月17日22:04
32

如果您看到了这一点,请检查是否没有破坏某些会话数据。在我的案例中,有数千条相同的信息被注入到闪信中。只是说说而已。

我还要补充一点,如果你认为解决方案是扩大你的cookie商店(正如大多数其他答案所建议的那样),那么你最好重新考虑一下你实际上在cookie中放了什么。如果您需要多个身份验证令牌、会话ID,也许还需要一些布局/跟踪cookie,那么您现在正处于90年代。

5
  • 1
    我正在深度合并一些参数以保存状态!
    – 安瓦尔
    评论 2017年9月17日18:36
  • 这也是我犯错误的原因。在闪信中输入了太多数据。
    – 指关节
    评论 2017年11月1日18:18
  • 1
    是的,我在实现OmniAuth-Keycoard策略时遇到了这个问题。Keycoard提供了大量信息,包括用户的访问列表。只有少数与作为cookie存储有关。。。 评论 2021年12月15日10:47
  • 1
    金牌!这是一个闪信问题。 评论 2022年3月23日14:34
  • @user1185081,我还实现了OmniAuth-Keycoard,我需要将access_token、refresh_token和id_token存储到会话中,因为获取新的访问令牌和注销用户都需要这些。你是怎么做到的? 评论 2023年5月24日4:38
10

在会话中存储模型对象不是一个好主意。

查看有关此主题的railscast:http://railscasts.com/剧集/13-dangers-of-model-in-session?autoplay=true

更好的做法是将id(在本例中是用户的id)存储在会话中。那么你就不会有这个问题了。

(另请参见上文Frederick Cheung的评论)。

10

该错误是因为您正在尝试序列化用户模型在cookie中存储对象时,rails将使用马歇尔泵它可以生成大量内容,因为这是用户记录中的所有内容

而不是使用存储实际用户记录session[:current_user]=用户试着只存储用户的ID,然后有一个方法,一个从中查找用户的方法例如

定义sign_in(用户)...会话[:current_user_id]=用户id结束定义当前用户@current_user||=用户.find(会话[:current_用户_id])结束
9

错误消息明确指出了cookie存储大小溢出的问题。

您的会话(默认情况下在cookie中)需要移动到活动记录store或memcache store来修复此问题。

对于数据库会话:

config.action_controller.ssion_store=:活动记录存储

您需要创建会话表,如下所示

rake数据库:会话:创建rake数据库:迁移

对于Memcache会话:

config.action_controller.session_store=:内存缓存存储

此外,您还需要设置一个mem缓存服务器并按如下所示进行配置:

config.cache_store=:mem_cache_store,“本地主机”,“127.0.0.1:11211”,{:namespace=>“myapp123”}
4

我的问题是因为代码

救援标准错误=>eflash[:error]=“错误是#{error.message}”结束

这个错误消息太大了

1
  • 没错,cookie的最大大小是4kb;然后,flash被存储在它看起来的会话中,然后它溢出:错误分配 评论 2022年6月10日16:07
1

这个错误在我运行规范时出现。将Capybara从1.x更新为2.x后。只要耙tmp:清除就解决了。

0

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.