如果没有匹配的路由,则路由路由

时间:2010-11-11 13:44:53

标签: ruby-on-rails routing

如果没有路由匹配,是否有将用户重定向到特定控制器#action的解决方案?我有一个像这样的“最后规则”:

 match ":rest" => "application#notfound", :constraints => { :rest => /.*/ }

将所有“其他”内容重定向到应用程序#notfound。问题是插件有自己的路径,其中低于这个规则,永远不会被调用。

4 个答案:

答案 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 => /.*/ }

但也许最后一场比赛对你不利,因为它会覆盖插件/引擎的所有路线。我认为最好的解决方案是使用自定义机架中间件来处理特殊情况。