如何在使用带有glob路由的引擎时覆盖Rails 3.1“路由错误”?

时间:2011-08-01 18:55:41

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我正在将旧版应用转换为Rails 3.1。新应用程序使用提供glob路径的引擎:

# myengine/config/routes.rb
Rails.application.routes.draw do
  match 'foo/bar/*path' => 'myengine/foobar#index', :format => false
end

遗留应用程序使用最终的捕获通配符路由来提供自定义处理(而不是熟悉的Rails“路由错误”页面)以用于其他不匹配的路由:

# myapp/config/routes.rb
Myapp::application.routes.draw do
  # ...
  match '*path' => 'failures#index', :format => false
end

不知何故,这条小路线正在干扰引擎的路线。如果我评论应用程序的catchall路线,引擎的路线工作正常。但是,如果我将其留在引擎路径中,则永远不会匹配,而是使用应用程序到failures#index的catchall路由:

Started GET "/foo/bar//projects/x/vol1/prod22/9907042031/9907042031.aff/ImageProperties.xml" for 10.71.1.136 at 2011-08-02 15:46:48 -0700
  Processing by FailuresController#index as JS
  Parameters: {"path"=>"foo/bar/projects/x/vol1/prod22/9907042031/9907042031.aff/ImageProperties.xml"}
Rendered failures/index.html.erb within layouts/application (0.0ms)
Completed 200 OK in 47ms (Views: 46.9ms)

如何在不破坏引擎路由的情况下覆盖默认的Rails 3.1路由错误处理程序?

1 个答案:

答案 0 :(得分:2)

处理此的正确方法曾经是 rescue_from和自定义错误处理程序,而不是使用引擎恶意的catchall路由。但是,custom error handlers are no longer supported in Rails 3.1并且这可能不会在Rails 3.2之前修复,如果有的话。如果您需要自定义错误处理并使用带路由的引擎,vidibus-routing_error gem提供了一种解决方法。

另一种选择是将自定义错误处理程序放入堆栈底部的Rack端点。