如果没有路由匹配,是否有将用户重定向到特定控制器#action的解决方案?我有一个像这样的“最后规则”:
match ":rest" => "application#notfound", :constraints => { :rest => /.*/ }
将所有“其他”内容重定向到应用程序#notfound。问题是插件有自己的路径,其中低于这个规则,永远不会被调用。
答案 0 :(得分:7)
创建一个catch-all路由并将其作为routes.rb文件中的最后一条规则。
match "*rest" => "application#notfound"
您还可以通过控制器中的params[:rest]
获取路径作为参数。
答案 1 :(得分:3)
你绝对不是唯一有这个问题的人。我知道这很令人沮丧,但是请给它一点时间 - 我相信Rails团队会把简单而优雅的东西放在一起。我处于类似的位置,只需要知道用户输入的错误网址资源。
Google快速搜索,我发现这篇文章展示了full solution to the Rails 3.0 rescue_from ActionController::RoutingError problem。解决方案涉及Route Globbing并解决了我需要处理不正确的URL并捕获输入的URL。希望这有帮助!
答案 2 :(得分:1)
将此规则放在最后。路由匹配从上到下,如果它确实找到匹配,那么它就会停在那里。
答案 3 :(得分:1)
也许这不是最好的方法,但是当你找不到更好的解决方案时它会起作用
for rails 2.3,在应用程序控制器上捕获异常,如
rescue_from(ActionController::RoutingError) { redirect_to "/xpto" #add your code here }
Rails 3
在初始化程序中输入如下代码:
module ActionDispatch
class ShowExceptions
def render_exception(env, exception)
if exception.kind_of? ActionController::RoutingError
render(500, 'it was routing error')
else
render(500, "some other error")
end
end
end
端
或更干净的东西:
或:
match '/:anything', :to => "home#routing_error", :constraints => { :anything => /.*/ }
但也许最后一场比赛对你不利,因为它会覆盖插件/引擎的所有路线。我认为最好的解决方案是使用自定义机架中间件来处理特殊情况。