将3.12升级到4,运行rails s,在local_cache_middleware中获取堆栈级别太深的错误

时间:2014-07-06 18:01:20

标签: ruby-on-rails

使用rake rails:update,精心更新了覆盖文件,并让我的rspec规格运行为绿色。但当我跑rails s时,我点击了这个:

Unexpected error while processing request: stack level too deep
/Users/Alex/.rvm/gems/ruby-2.0.0-p451/gems/activesupport-4.1.4/lib/active_support/cache/strategy/local_cache_middleware.rb:33

具体来说,它是在上面引用的文件中的response = @app.call(env)(第26行)。

我正在通过检查清单来查看我是否可能错过了某处的配置设置。谁能给我一个线索?

1 个答案:

答案 0 :(得分:5)

所以,我做的第一件事就是通过添加:

来完成异常的完全回溯
      rescue Exception => e
        puts e.backtrace
        LocalCacheRegistry.set_cache_for(local_cache_key, nil)
        raise
      end

然后在我之前看到的缓存中间件之前揭示了一条关键线:

/Users/Alex/.rvm/gems/ruby-2.0.0-p451/gems/activesupport-4.1.4/lib/active_support/logger.rb:38
Unexpected error while processing request: stack level too deep
/Users/Alex/.rvm/gems/ruby-2.0.0-p451/gems/activesupport-4.1.4/lib/active_support/cache/strategy/local_cache_middleware.rb:35

我跳进列出的行,看起来像这样:

    define_method(:level=) do |level|
      logger.level = level
      super(level)
    end

然后搜索了我的其余部分,看看我在哪里触摸logger.level。 (如果我没有能够以这种方式找到电话,我会使用Kernel#caller。)啊哈,我发现:config/initializers/quiet_assets.rb,这是什么?看起来像我在很久以前放入初始化器的猴子补丁:

# taken from https://stackoverflow.com/questions/6312448/how-to-disable-logging-of-asset-pipeline-sprockets-messages-in-rails-3-1
if Rails.env.development?
  Rails.application.assets.logger = Logger.new('/dev/null')
  Rails::Rack::Logger.class_eval do
    def call_with_quiet_assets(env)
      previous_level = Rails.logger.level
      Rails.logger.level = Logger::ERROR if env['PATH_INFO'] =~ %r{^/assets/}
      call_without_quiet_assets(env)
    ensure
      Rails.logger.level = previous_level
    end
    alias_method_chain :call, :quiet_assets
  end
end

当我评论这个时,噗,我的错误消失了,我能够在浏览器中加载一个页面。现在我已经删除了初始化程序并且很好。 :)对于使用How to disable logging of asset pipeline (sprockets) messages in Rails 3.1?的用户,请务必在升级时将其删除!