Чтобы это работало в Rails 3, вам нужно сделать следующее:
Сначала создайте страницы ошибок 404 и 500.Я помещаю мои в app/views/errors/404.html.erb
и app/views/errors/500.html.erb
.
Во-вторых, добавьте в application_controller.rb следующее:
unless Rails.application.config.consider_all_requests_local
rescue_from Exception, :with => :render_error
rescue_from ActiveRecord::RecordNotFound, :with => :render_not_found
rescue_from AbstractController::ActionNotFound, :with => :render_not_found
rescue_from ActionController::RoutingError, :with => :render_not_found
rescue_from ActionController::UnknownController, :with => :render_not_found
rescue_from ActionController::UnknownAction, :with => :render_not_found
end
def render_error exception
Rails.logger.error(exception)
render :template => "/errors/500.haml", :status => 500
end
def render_not_found exception
Rails.logger.error(exception)
render :template => "/errors/404.haml", :status => 404
end
Наконец, сделайте ваш production.rb не учитывающим все запросы локально:
config.consider_all_requests_local = false
PS: Имейте в виду, что, когда происходит полная ошибка маршрутизации - то есть, когда нет абсолютно никакого совпадения маршрута, а не только ошибка ActiveFecord NotFound, будет отображаться public / 404.html, поэтомухорошо иметь это на месте.Обычно я просто перенаправляю его на мой errors_controller, который гарантирует, что любые 404 ошибки, не обнаруженные последними упомянутыми исключениями, все еще правильно перенаправляются в ErrorsController.
<script type="text/javascript">
<!--
window.location = "<%= request.host_with_port %>/errors/404"
//-->
</script>