25

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

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

这样的事情会很棒:

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

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

艾略特

4

4 回答 4

50

您可以路由到提供简单 404 的机架端点(导轨 3):

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

这特别方便,例如,定义到您的omniauth端点的命名路由:

match 'auth/:action', to: proc { [404, {}, ['']] }, as: :omniauth_authorize
于 2012-08-24T22:51:09.313 回答
3

In your routes.rb:

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

In FoobarController:

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

If you need to render the same 404 file as a normal 404, you can do that with render :file.

See ActionController::Base documentation for examples.

于 2009-07-17T07:16:05.213 回答
2

为什么不在 Apache/nginx 中使用 mod_rewrite(或者无论如何 nginx 会重写)链接到不存在的页面或发送 410(已消失,不再存在)标志?

无论如何,如果您希望 rails 应用程序执行此操作,我认为方法就像您建议的那样,创建一个命名路由到执行render(:file => "#{RAILS_ROOT}/public/404.html", :status => 404)

于 2009-07-16T19:30:31.033 回答
1

比之前对 404 的答案略短的版本可以放在一行中。 get '*_', to: ->(_) { [404, {}, ['']] }

于 2017-07-18T08:49:38.627 回答