"在升级到Rails 4之后,没有这样的中间件可以插入:Rack :: Lock(RuntimeError)"

Wil*_*iss 20 rack ruby-on-rails ruby-on-rails-4

升级到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)

违规行是我的" 删除斜线 "机架重写规则:

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

有任何想法吗?

Wil*_*iss 40

正如错误所暗示的那样("之前没有插入此类中间件"),问题在于您之前尝试插入的中间件(而不是您尝试插入的中间件,这是我最初的假设).

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

要查找替换项,可以rake middleware从rails项目目录运行,并查找堆栈开头附近的内容.我将选择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
Run Code Online (Sandbox Code Playgroud)

  • 让我困惑的一件事是"rake middleware"正在返回包括`Rack :: Lock`在内的预期中间件的完整列表,但由于没有找到`Rack :: Lock`,我的rspec测试失败了.最后我意识到(通过直接检查config.middleware)rspec当然没有加载完整的中间件堆栈.因此,我将重写内容移至`config/environments/production.rb`,因为我无论如何都不会在rspec中测试这些重定向. (3认同)