В application_conroller.rb
добавить следующее:
# You want to get exceptions in development, but not in production.
unless Rails.application.config.consider_all_requests_local
rescue_from ActionController::RoutingError, with: -> { render_404 }
end
def render_404
respond_to do |format|
format.html { render template: 'errors/not_found', status: 404 }
format.all { render nothing: true, status: 404 }
end
end
Я обычно также спасти следующие исключения, но это до вас:
rescue_from ActionController::UnknownController, with: -> { render_404 }
rescue_from ActiveRecord::RecordNotFound, with: -> { render_404 }
Создание контроллера ошибок:
class ErrorsController < ApplicationController
def error_404
render 'errors/not_found'
end
end
Тогда в routes.rb
unless Rails.application.config.consider_all_requests_local
# having created corresponding controller and action
get '*path', to: 'errors#error_404', via: :all
end
И последняя вещь, чтобы создать not_found.html.haml
(или любой другой механизм шаблонов вы используете) под /views/errors/
:
%span 404
%br
Page Not Found
Это не работает в Rails 4.2.5. Я предполагаю, что это связано с тем, что исключение возникает ActionDispatch до запуска любого кода контроллера. – depquid
@depquid Я написал его во времена Rails 4.0.x, но только что протестировал его с Rails 4.2.5. Я полагаю, вы не добавили маршрут и не создали 'errors_controller.rb' :) Если это так - пожалуйста, не забудьте убрать нижний план, если у вас нет причин оставлять его –
Извините, я не настроил маршрут правильно. Но почему, 'rescue_from ActionController :: RoutingError, с: -> {render_404}', если вы направляетесь непосредственно к действию? – depquid