【问题标题】:"No such middleware to insert before: Rack::Lock (RuntimeError)" after upgrading to Rails 4“之前没有要插入的中间件:Rack::Lock (RuntimeError)”升级到 Rails 4 后
【发布时间】:2013-06-16 08:12:46
【问题描述】:

升级到 Rails 4 后出现以下错误:

.../ruby-1.9.3-p125/gems/actionpack-4.0.0.rc2/lib/action_dispatch/middleware/stack.rb:125:in 'assert_index': No such middleware to insert before: Rack::Lock (RuntimeError)

违规行是我的“remove slashes”机架重写规则:

config.middleware.insert_before(Rack::Lock, Rack::Rewrite) do
  r301 %r{^/(.*)/$}, '/$1', :headers => {'Cache-Control' => 'public, max-age='+2.week.to_s}
end

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails rack ruby-on-rails-4


    【解决方案1】:

    正如错误提示(“之前没有要插入的中间件”),问题出在您尝试插入之前的中间件(而不是您的中间件正在尝试插入,这是我最初的假设)。

    在 Rails4 中,默认启用线程,这会删除 Rack::Lock

    要找到替代品,您可以从您的 rails 项目目录运行 rake middleware,然后在堆栈开头附近寻找一些东西。我将选择Rack::Runtime,因为它位于堆栈的早期,而且看起来很标准。

    所以重写配置现在是:

    config.middleware.insert_before(Rack::Runtime, Rack::Rewrite) do
      r301 %r{^/(.*)/$}, '/$1', :headers => {'Cache-Control' => 'public, max-age='+2.week.to_s}
    end
    

    【讨论】:

    • 只有一件事让我困惑了一段时间,rake middleware 正在返回包括Rack::Lock 在内的预期中间件的完整列表,但由于找不到Rack::Lock,我的 rspec 测试失败了。最后我意识到(通过直接检查 config.middleware)rspec 当然没有加载完整的中间件堆栈。因此,我将重写移至 config/environments/production.rb,因为无论如何我都不会在 rspec 中测试这些重定向。
    • 感谢您解决这个问题!不幸的是,您在答案中链接到的资源不再存在。
    • 就我而言,我需要输入config.middleware.insert_before Rack::Runtime, Rack::LiveReload,这可能是专门针对Rails >=6 的。 Details are here in the rack-livereload README
    猜你喜欢
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 2019-06-18
    相关资源
    最近更新 更多