在中间件中使用Rails.application.routes.recognize_path会破坏应用程序

时间:2015-12-12 16:03:43

标签: ruby-on-rails rack

下一个中间件会导致Rails应用无法加载资产

class Wtf
  def initialize(app)
    @app = app
  end

  def call(env)
    request = Rack::Request.new(env)
    # next line is causing all troubles
    Rails.application.routes.recognize_path request.path
    @app.call(env)
  end
end

如果我用

替换问题行
Rails.application.routes.recognize_path '/'

然后一切都再次起作用。

如何将request.path作为recognize_path的参数发送,导致应用无法加载资源?

可在此处找到该应用https://github.com/mib32/wtf-middleware

1 个答案:

答案 0 :(得分:1)

Rails资产管道在您在请求中可以看到的散列路径下编译资产,这些资源的处理方式与其他路由不同,因此recognize_path无法正常运行。如果您不需要使用中间件来处理资产,则应跳过这些路径。

unless request.path =~ %r(^/assets/)
  Rails.application.routes.recognize_path request.path
end

或者,

begin
  Rails.application.routes.recognize_path request.path
rescue ActionController::RoutingError
  # pass
end