【问题标题】:Rails: redirect all unknown routes to root_urlRails:将所有未知路由重定向到 root_url
【发布时间】:2011-05-07 03:10:07
【问题描述】:

每当用户点击错误的页面时,rails 都会显示公用文件夹中的 404.html。但是,我只想将浏览器重定向到根页面,而不显示任何内容。所以我尝试了globbing,但无济于事,它仍然显示404页面。这是我的路线文件的摘录:

# ...
map.root :controller => 'home', :action => 'home'
map.connect '*', :controller => 'home', :action => 'home'

有什么建议吗?谢谢各位!

【问题讨论】:

  • 我假设你有一个 'home_controller',其中包含 'home' 动作,它表示类似 render :nothing => true?
  • 没有。 home 控制器中有一个 home 动作,还有一个 home 视图(home.html.erb)。

标签: ruby-on-rails redirect routing routes url-routing


【解决方案1】:

如果您的项目由 rails 3 提供支持,只需将此行添加到您的 routes.rb

match '*path' => redirect('/')

编辑:如果您使用的是 Rails 4 或 5

match '*path' => redirect('/'), via: :get

get '*path' => redirect('/')

【讨论】:

  • 谢谢!好吧,它是 Rails 2.3.10
  • 非常感谢很多,伙计!它做到了。这就是我在 Rails 2 中的做法:map.connect '*path', :controller => 'home', :action => 'home' 所以,'*path' 是整个事情的关键。再次感谢:-)
  • 你也可以用get代替match,这只是添加via: :get的简写。
  • 确保将其放在路线列表的底部。
  • 那是因为路由匹配,这就是路由器所关心的。您需要在控制器中进行额外检查,以查看具有所提供 ID 的文章是否存在。
【解决方案2】:

喜欢 Arkan 的回答。有一点,如果不希望在开发环境中出现这种行为,那么可以这样做 -

match '*path' => redirect('/')   unless Rails.env.development?

【讨论】:

    【解决方案3】:

    导轨 4-

    (routes.rb)

    您仍然可以使用简单的get 重定向所有未知路由。

      get '*path', to: 'home#index'
    

    如果您希望为 POST 和 GET 请求提供路由,您仍然可以使用 match,但 Rails 希望您通过 via 指定请求方法。

      match "*path" => "home#index", via: [:get, :post]  
    

    请记住,routes.rb 是按顺序执行的(匹配符合所提供路径结构的第一个路由),因此请将通配符捕获放在匹配的底部。

    【讨论】:

    • 谢谢你把它放在底部的通知。
    • 这还能用吗?在我的 Rails 4 应用程序中似乎不起作用。
    • 我在 Rails 5 中遇到问题,get '*path', to: 'searches#new' 导致我的应用中所有上传的图像出现 406 错误。
    【解决方案4】:

    rails 5.2 中似乎存在一个错误,其中 active_storage 路由被包罗万象的路由拾取,导致上传图像的链接断开。该问题已在 github 上的 rails repo 中报告,并且有人对以下补丁进行了评论,直到该错误在新版本中得到修复:

    routes.rb 之前end

    get '*all', to: 'application#index', constraints: lambda { |req|
        req.path.exclude? 'rails/active_storage'
      }
    

    然后在应用控制器中添加:

    def index
      flash.notice = 'No page found at that address'
      redirect_to root_path
    end
    

    【讨论】:

    【解决方案5】:

    你需要创建一个控制器来做到这一点

    class RedirectsController 
    
      def index
        redirect_to root_url
      end
    end
    

    在你的路线中

    map.connect '*', :controller => 'redirects', :action => 'index'
    

    【讨论】:

    • 这也是 Rails 3 的答案吗?
    • 也适用于 rails 3。你只需要用火柴改变线。请参阅路由指南中的 globing
    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2016-11-26
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多