2009-07-16 1 views
20

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

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

Нечто подобное было бы здорово:

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

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

Элиот

ответ

39

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

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

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

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

Это хороший подход для любого ответа, который не требует контроллера. Это еще менее эффективно, чем в Apache/nginx. – mmell

+7

В Rails 4 используйте опцию: to, например. 'get '/ apple-touch * str', to: proc {[404, {}, ['']]}' – mmell

+1

@mmell Это не сработает, вы должны сделать это: 'get '/: str' , to: proc {[404, {}, ['']]}, ограничения: {str:/apple-touch. * /} ' – Amala

2

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

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

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 документация для примеров.

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^