Подтвердить что ты не робот

Самый простой способ определения маршрута, который возвращает 404

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

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

Что-то вроде этого было бы здорово:

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

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

Эллиот

4b9b3361

Ответ 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, {}, ['']] }