【问题标题】:Rails route if no route matched如果没有匹配的路由,Rails 路由
【发布时间】:2010-11-11 13:44:52
【问题描述】:

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

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

将所有“其他”内容重定向到 application#notfound。问题是具有自己的路由的插件设置 below 是规则并且永远不会被调用。

【问题讨论】:

  • 为什么不简单地编辑 public/404.html?

标签: ruby-on-rails routing


【解决方案1】:

制作一条包罗万象的路线,并将其作为您的 routes.rb 文件中的最后一条规则。

match "*rest" => "application#notfound"

您还可以通过控制器中的params[:rest] 获取路径作为参数。

【讨论】:

    【解决方案2】:

    您绝对不是唯一遇到此问题的人。我知道这很令人沮丧,但请给它一些时间——我相信 Rails 团队会整理出一些简单而优雅的东西。我也有类似的情况,只是我需要知道用户输入的不正确的 url 资源。

    通过 Google 快速搜索,我发现这篇文章展示了 full solution to the Rails 3.0 rescue_from ActionController::RoutingError problem。该解决方案涉及 Route Globbing 并解决了我处理错误 url 和捕获输入的 url 的需要。希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      将此规则放在最后.. 路由匹配从上到下,因此如果确实找到匹配项,则会停在那里。

      【讨论】:

      • 我把它作为最后一条规则。问题是,plugins 将被添加 应用程序规则之后,所以我不得不找到另一种方法:(
      • 我知道问题出在哪里。插件应该为您提供一种调用其路由的方法。例如 devise 提供了 devise_for 路由方法。
      【解决方案4】:

      也许这不是最好的方法,但是当你找不到更好的解决方案时它会起作用

      对于 rails 2.3,在应用程序控制器中,捕获异常

      rescue_from(ActionController::RoutingError) { redirect_to "/xpto" #add your code here }
      

      轨道 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 => /.*/ }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        • 2011-11-14
        • 1970-01-01
        • 2014-04-25
        相关资源
        最近更新 更多