我正在将旧版应用转换为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路由错误处理程序?
答案 0 :(得分:2)
处理此的正确方法曾经是 rescue_from
和自定义错误处理程序,而不是使用引擎恶意的catchall路由。但是,custom error handlers are no longer supported in Rails 3.1并且这可能不会在Rails 3.2之前修复,如果有的话。如果您需要自定义错误处理并使用带路由的引擎,vidibus-routing_error
gem提供了一种解决方法。
另一种选择是将自定义错误处理程序放入堆栈底部的Rack端点。