每当用户点击错误页面时,rails都会显示公共文件夹中的404.html。但是,我只想将浏览器重定向到根页面,而不显示任何内容。所以我尝试了通配,但无济于事,它仍然显示404页面。这是我的路线文件的摘录:
# ...
map.root :controller => 'home', :action => 'home'
map.connect '*', :controller => 'home', :action => 'home'
有什么建议吗?谢谢,伙计们!
答案 0 :(得分:74)
如果您的项目由rails 3供电,请将此行添加到您的routes.rb
match '*path' => redirect('/')
编辑:如果您使用的是Rails 4或5
match '*path' => redirect('/'), via: :get
或
get '*path' => redirect('/')
答案 1 :(得分:19)
就像Arkan的回答一样。有一点,如果在开发环境中不想要这种行为,那么可以做 -
match '*path' => redirect('/') unless Rails.env.development?
答案 2 :(得分:10)
Rails 4 -
(的的routes.rb 强>)
您仍然可以使用简单的get
重定向所有未知路由。
get '*path', to: 'home#index'
如果您希望为POST和GET请求提供路由,您仍然可以使用匹配,但Rails希望您通过via
指定请求方法。
match "*path" => "home#index", via: [:get, :post]
请记住,routes.rb
是按顺序执行的(匹配适合所提供路径结构的第一条路径),因此请在匹配项的底部放置通配符。
答案 3 :(得分:1)
你需要创建一个控制器才能做到这一点
class RedirectsController
def index
redirect_to root_url
end
end
在您的路线中
map.connect '*', :controller => 'redirects', :action => 'index'
答案 4 :(得分:1)
rails 5.2中似乎存在一个错误,其中catch_all路线拾取了active_storage路线,导致指向已上传图像的链接断开。该问题已在github上的rails回购中报告,并且有人用以下修补程序发表了评论,直到该错误在新版本中得到修复为止:
在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