题 Rails:将所有未知路由重定向到root_url


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

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

有什么建议么?多谢你们!


36
2017-11-09 09:16


起源


我假设你有一个'home_controller',它包含'home'动作,它表示像render:nothing => true? - jenjenut233
不。家庭控制器中有一个家庭活动,还有一个家庭视图(home.html.erb)。 - Albus Dumbledore


答案:


如果您的项目由rails 3供电,请将此行添加到routes.rb中

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

编辑:Rails 4支持

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

70
2017-11-09 14:52



谢谢!嗯,这是Rails 2.3.10 - Albus Dumbledore
谢谢 批量, 人!它做到了。这就是我在rails 2中做到的方式: map.connect '*path', :controller => 'home', :action => 'home' 所以,就是这样 '*path' 这是整个事情的关键。再次感谢 :-) - Albus Dumbledore
你也可以使用 get 代替 match,这只是添加的简写 via: :get。 - Peeja
确保将其放在路线列表的底部。 - ahnbizcad
那是因为路由是匹配的,这就是路由器所关心的。您需要在控制器中进行额外检查,以查看是否存在具有提供的ID的文章。 - Almir Sarajčić


就像Arkan的回答一样。有一点,如果不想在开发环境中这种行为,那么可以做 -

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

19
2017-11-09 14:15





导轨4-

的routes.rb

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

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

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

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

记住这一点 routes.rb 按顺序执行(匹配适合所提供的路径结构的第一个路径),因此在匹配的底部放置通配符。


10
2017-09-25 18:09



感谢您将其置于底部的通知。 - ahnbizcad
这仍然有用吗?似乎在我的Rails 4应用程序中不起作用。 - Jeremy Thomas
它在轨道5中工作正常 - vidur punj
我在rails 5中遇到了问题 get '*path', to: 'searches#new' 导致我的应用中所有上传图片出现406错误。 - tomb


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

class RedirectsController 

  def index
    redirect_to root_url
  end
end

在你的路线

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

1
2017-11-09 09:23



这是Rails 3的答案吗? - Sam Wilder
也适用于导轨3。你只需要匹配改变ligne。请参阅路线指南中的全文 - shingara