Самый простой способ определить маршрут, который возвращает 404 - PullRequest
22 голосов
/ 16 июля 2009

У меня есть требование указать именованный маршрут в проекте Ruby on Rails, который возвращает страницу public / 404.html вместе с кодом ответа сервера 404.

Оставить это поле пустым - не вариант, пожалуйста, не спрашивайте, почему, это просто :) Это обязательно должен быть именованный маршрут, или запись map.connect подойдет.

Что-то вроде этого было бы замечательно:

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

Кто-нибудь знает, каков самый простой способ сделать что-то подобное. Я мог бы создать метод контроллера, который рендерит файл 404.html, но подумал, что может существовать более чистый способ сделать это. С нетерпением жду любых ответов - спасибо,

Элиот

Ответы [ 4 ]

44 голосов
/ 25 августа 2012

Вы можете направить к конечной точке стойки (рельсы 3), которая торгует простым 404:

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

Это особенно удобно, например, для определения именованного маршрута к конечной точке omniauth :

match 'auth/:action', to: proc { [404, {}, ['']] }, as: :omniauth_authorize
3 голосов
/ 17 июля 2009

В ваших маршрутах.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 голосов
/ 16 июля 2009

Почему бы вам не сделать это в Apache / nginx, где вы используете mod_rewrite (или, тем не менее, nginx перезаписывает), чтобы ссылаться на несуществующую страницу, или вместо этого отправлять флаг 410 (ушел, больше не существует)?

В любом случае, если вы хотите, чтобы приложение rails делало это, я думаю, что путь, как вы предложили, создать именованный маршрут к действию, которое выполняет render(:file => "#{RAILS_ROOT}/public/404.html", :status => 404)

1 голос
/ 18 июля 2017

Немного короче версия, чем предыдущие ответы на 404 любой получить в одну строку. get '*_', to: ->(_) { [404, {}, ['']] }

...