Самый простой способ определения маршрута, который возвращает 404
У меня есть требование указать именованный маршрут в проекте Ruby on Rails, который возвращает страницу public/404.html вместе с кодом ответа сервера 404.
Если оставить его пустым, это не вариант, пожалуйста, не задавайте вопросов, почему это просто:) Это абсолютно должен быть именованный маршрут или запись map.connect.
Что-то вроде этого было бы здорово:
map.my_named_route '/some/route/', :response => '404'
Кто-нибудь знает, какой самый простой способ сделать что-то подобное. Я мог бы создать метод контроллера, который отображает файл 404.html, но думал, что может быть существующий более чистый способ сделать это. С нетерпением ждем любых ответов - спасибо,
Эллиот
Ответы
Ответ 1
Вы можете перейти на конечную точку стойки (рельсы 3), которая поддерживает простой 404:
match 'my/route', to: proc { [404, {}, ['']] }
Это особенно удобно, например, для определения именованного маршрута в конечной точке omniauth:
match 'auth/:action', to: proc { [404, {}, ['']] }, as: :omniauth_authorize
Ответ 2
Почему вы не делаете это в Apache/nginx, где вы используете mod_rewrite (или, как правило, nginx переписывает), чтобы ссылаться на несуществующую страницу или вместо этого отправлять флаг 410 (Gone, больше не существует)?
В любом случае, если вы хотите, чтобы приложение rails сделало это, я думаю, что так, как вы предложили, создайте именованный маршрут для действия, которое выполняет render(:file => "#{RAILS_ROOT}/public/404.html", :status => 404)
Ответ 3
В ваших route.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.
Ответ 4
В более короткой версии, чем предыдущие ответы на 404, вы попадаете в одну строку.
get '*_', to: ->(_) { [404, {}, ['']] }