是什么导致“ArgumentError(转储格式错误)”?

时间:2012-02-02 21:47:35

标签: ruby-on-rails-3 spree rails-3-upgrade

在Spree中对产品列表没有分页并且仅列出前10个产品的错误行为进行故障排除时,我尝试在本地开发环境中重现错误,并在第一页加载时收到错误:< / p>

ArgumentError (dump format error)

与往常一样,我先检查了我的另一个脑子。最热门的搜索结果是:https://github.com/rails/rails/issues/2509

虽然启动该线程的用户和其他几个海报试图从Rails 3.0.9升级到Rails 3.1,但我认为它不适用于我的情况。我正在运行的Spree 0.60.2应用程序是在Rails 3.0.9。

然而,事实证明,只需清除我的localhost cookie即可解决问题。为什么呢?

5 个答案:

答案 0 :(得分:10)

我将推测,因为我在我的开发环境中运行多个应用程序,包括同一应用程序的Rails 3.1 / Spree 0.70版本,并且我通过localhost访问所有这些应用程序,在某些类型的cookie中,3.1版本设置了一些3.0.9版本无法进食的cookie。它可能与@Fjan在其帖子中提到的内容(https://github.com/rails/rails/issues/2509):

有关
  

我跟踪了这​​个错误,因为FlashHash类在   会话已更改为不再继承自Hash类   rails 3.1。

我跑了一个实验。如果我在应用程序的任一版本上执行 not 登录,我可以启动一个并关闭它并启动另一个并且不会遇到此问题。但是,当我登录到3.0.9版本然后关闭该服务器并启动3.1版本时,我再次收到相同的错误。这是一个部分的痕迹:

  

activesupport(3.1.1)lib / active_support / message_verifier.rb:34:in   load' activesupport (3.1.1) lib/active_support/message_verifier.rb:34:in验证'actionpack   (3.1.1)lib / action_dispatch / middleware / cookies.rb:280:在[]' actionpack (3.1.1) lib/action_dispatch/middleware/session/cookie_store.rb:53:in块中   unpacked_cookie_data'actionpack(3.1.1)   LIB / action_dispatch /中间件/会话/ abstract_store.rb:55:在   stale_session_check!' actionpack (3.1.1) lib/action_dispatch/middleware/session/cookie_store.rb:51:in unpacked_cookie_data' rack(1.3.6)lib / rack / session / cookie.rb:96:in   extract_session_id' actionpack (3.1.1) lib/action_dispatch/middleware/session/abstract_store.rb:51:in块   在extract_session_id'actionpack(3.1.1)中   LIB / action_dispatch /中间件/会话/ abstract_store.rb:55:在   stale_session_check!' actionpack (3.1.1) lib/action_dispatch/middleware/session/abstract_store.rb:51:in extract_session_id'机架(1.3.6)   lib / rack / session / abstract / id.rb:43:in load_session_id!' rack (1.3.6) lib/rack/session/abstract/id.rb:32:in []'rack(1.3.6)   lib / rack / session / abstract / id.rb:252:在current_session_id' rack (1.3.6) lib/rack/session/abstract/id.rb:258:in session_exists?'架   (1.3.6)lib / rack / session / abstract / id.rb:104:in exists?' rack (1.3.6) lib/rack/session/abstract/id.rb:114:in load_for_read!'机架(1.3.6)   lib / rack / session / abstract / id.rb:64:in has_key?' actionpack (3.1.1) lib/action_dispatch/middleware/flash.rb:260:in确保通话'   actionpack(3.1.1)lib / action_dispatch / middleware / flash.rb:261:in   call' rack (1.3.6) lib/rack/session/abstract/id.rb:195:in上下文”   rack(1.3.6)lib / rack / session / abstract / id.rb:190:在`call'

反过来也是如此。当我登录3.1版本然后关闭该服务器并启动3.0.9版本时,我收到了同样的错误。这是一个部分的痕迹:

  

activesupport(3.0.9)lib / active_support / message_verifier.rb:34:in   load' activesupport (3.0.9) lib/active_support/message_verifier.rb:34:in验证'actionpack   (3.0.9)lib / action_dispatch / middleware / cookies.rb:253:在[]' actionpack (3.0.9) lib/action_dispatch/middleware/session/cookie_store.rb:68:in块中   unpacked_cookie_data'actionpack(3.0.9)   LIB / action_dispatch /中间件/会话/ abstract_store.rb:223:在   stale_session_check!' actionpack (3.0.9) lib/action_dispatch/middleware/session/cookie_store.rb:66:in unpacked_cookie_data'actionpack(3.0.9)   LIB / action_dispatch /中间件/会话/ cookie_store.rb:57:在   extract_session_id' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:39:in load_session_id!” actionpack(3.0.9)   lib / action_dispatch / middleware / session / abstract_store.rb:27:in []' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:210:in current_session_id'actionpack(3.0.9)   LIB / action_dispatch /中间件/会话/ abstract_store.rb:239:在   exists?' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:96:in 的存在?” actionpack(3.0.9)   LIB / action_dispatch /中间件/会话/ abstract_store.rb:113:在   load_for_read!' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:53:in []”   actionpack(3.0.9)lib / action_dispatch / middleware / flash.rb:178:in   call' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:149:in呼叫'

对我来说值得注意的是,你不需要真正地进行升级。要重现此问题,您只需要运行两个版本的Rails,这两个版本的Rails设置具有相同名称的Cookie ...可能是按顺序(在我的实验中)或同时(我没有尝试过)。

希望这里的其他人能提供比这更明智的答案,以添加这个松散的解释所缺乏的细节。与此同时,如果您在开发过程中遇到此问题并且您不关心内部工作原理,请清除您的cookie(正如@tscolari在上面引用的主题中所建议的那样:https://github.com/rails/rails/issues/2509)并继续前进。欢呼声。

答案 1 :(得分:3)

我遇到了同样的问题。清除浏览器cookie解决了这个问题。发展模式。

答案 2 :(得分:2)

清除您的Cookie可以解决此问题,尝试使用其他浏览器打开您的应用或在Chrome上隐身,它可以正常工作。

答案 3 :(得分:2)

如果您正在制作并且不能要求您的用户清除cookie :) - 唯一的方法是在config / initializers / session_store.rb中更改session_store键

解决方案不太好,用户必须重新登录。

答案 4 :(得分:1)

在转移到rails 3.2后,我遇到了同样的问题。

根据@povkys的建议更改session_store密钥在我的情况下会有点矫枉过正,因为只有部分用户(少于1%)的会话出现问题。

我最终运行了一个脚本来解析数据库中的所有会话并删除那些无效的会话。这是代码,如果它可以帮助某人:

current_id = 0
failed_count = 0
while (sessions = ActiveRecord::Base.connection.select_all("Select id, data from sessions where id > #{current_id} limit 1000")).count > 0 do
  failed_ids = []
  sessions.each do |s|
    begin
      ActiveRecord::SessionStore::Session.unmarshal(s['data'])
    rescue
      failed_count += 1
      failed_ids.push s['id']
    end
  end

  ActiveRecord::Base.connection.execute("DELETE FROM sessions WHERE id in (#{failed_ids.join ','})") unless failed_ids.empty?
  current_id = sessions.last['id']
end
failed_count