Rails CookieOverflow

时间:2009-09-11 21:40:31

标签: ruby-on-rails

突然,在我的第一个Rails应用程序中,我开始看到这个错误:

/!\ FAILSAFE /!\  Fri Sep 11 17:30:48 -0400 2009
Status: 500 Internal Server Error
ActionController::Session::CookieStore::CookieOverflow

有一点研究指出使用cookie来存储会话数据,但我不这样做(至少不是故意的)。而且,这才刚刚开始发生。我今天开始工作的唯一一件事就是能够上传一个zip文件。我试图用来测试的zip文件是1.1MB。

此外,Firebug仅为此域显示2个Cookie。名为_html_session的那个是507B,名为user_credentials的那个是147B。上传的文件是否以一种大文件可能导致这种情况的方式临时存储?上传单个图像效果很好。

感谢您的帮助。

更新:糟糕。与我对下面的Vitaly和xijo的评论相反,错误不是相当即时。在这种情况下,我正在将某些内容上传到我的Image模型,并且当ImagesController调用@image.save!时,错误就会发生。

有趣的是,我仍然不明白 错误发生的地方。我创建了一个Image#before_validation方法并在那里引发异常,但CookieOverflow错误发生在我到达之前。在控制器进行保存调用之后和特定回调之前,是否有任何地方可以删除代码?我的理解是before_validation是第一个回调。

4 个答案:

答案 0 :(得分:18)

如果您尝试存储太长的flash[:notice] = 'blah'消息,则很容易发生这种情况,因为该消息存储在会话cookie中。

答案 1 :(得分:8)

我今天遇到了类似的问题。显然,Rails会话只能存储4k的数据。一种可能的解决方案是为会话使用数据库存储。

要做到这一点:

  1. 添加 config.action_controller.session_store = :active_record_store文件environment.rb
  2. 使用rake db:sessions:create
  3. 为您的会话创建迁移文件
  4. 运行迁移rake db:migrate
  5. 希望这有帮助

答案 2 :(得分:3)

唯一想到的是你以某种方式将.zip放入会话中。

调试它:

  • 将“require”ruby-debug“'添加到您的environment.rb
  • 找到它打印错误消息的位置并在其中放置一个“调试器”。
  • 运行它,当它点击'debugger'命令时它会停止
  • 检查调用堆栈以查看是否存在任何相关内容。
  • 在那个时间点检查会话。看看到底有什么空间。

答案 3 :(得分:0)

不,暂时上传的文件通常存储在您的临时文件夹中,与cookie及其大小无关。

您在会话对象中存储了什么?如果永久使用会话对象,也许最好将会话对象存储在数据库中。