定义返回404的路由的最简单方法

时间:2009-07-16 18:18:38

标签: ruby-on-rails routing routes http-status-code-404

我需要在Ruby on Rails项目中指定一个命名路由,该项目返回public / 404.html页面以及404服务器响应代码。

将它留空不是一个选项,请不要质疑为什么,它只是:)它绝对必须是一个命名路由,或者map.connect条目可以。

这样的事情会很棒:

map.my_named_route '/some/route/', :response => '404'

任何人都知道做这样事情的最简单方法是什么。我可以创建一个呈现404.html文件的控制器方法,但认为可能有一种更清晰的方法来执行此操作。期待任何回复 - 谢谢,

埃利奥特

4 个答案:

答案 0 :(得分:44)

您可以路由到出现简单404的机架端点(rails 3):

match 'my/route', to: proc { [404, {}, ['']] }

例如,这对于定义到omniauth endpoint的命名路线非常方便:

match 'auth/:action', to: proc { [404, {}, ['']] }, as: :omniauth_authorize

答案 1 :(得分:3)

在您的routes.rb中:

map.my_404 '/ohnoes', :controller => 'foobar', :action => 'ohnoes'

FoobarController

def ohnoes
  render :text => "Not found", :status => 404
end

如果您需要渲染与普通404相同的404文件,则可以使用render :file执行此操作。

有关示例,请参阅ActionController::Base文档。

答案 2 :(得分:2)

为什么不在Apache / nginx中使用mod_rewrite(或者nginx重写)链接到不存在的页面或者发送410(Gone,不再存在)Flag?

无论如何,如果您希望rails应用程序执行此操作,我认为方式与您建议的方式相同,创建指向执行render(:file => "#{RAILS_ROOT}/public/404.html", :status => 404)

的操作的命名路径

答案 3 :(得分:1)

比以前的404答案更短的版本任何一行得到。 get '*_', to: ->(_) { [404, {}, ['']] }