Подход 1
Заманчиво удалить DebugExceptions
промежуточное ПО из стека Rails приложения.
config/application.rb
:
config.middleware.delete ActionDispatch::DebugExceptions
Проблема в том, что этоименно промежуточное программное обеспечение, которое определяет Rails, не может найти маршрут и в таких случаях выдает ActionController::RoutingError
.Следовательно, если вы хотите отреагировать на это исключение в вашем exceptions_app
, этот подход вам не нужен.
Продолжайте и используйте этот подход, если для вас нормально видеть статус HTTP 404 ипростой текстовый ответ Not found
, когда маршрут не найден.
Подход 2
Обезьяна-патч или каким-то образом изменить ActionDispatch::DebugExceptions
.Фактически, в 2013 году было предложено изменить поведение DebugExceptions
, чтобы оно пропускало журналирование исключений, зарегистрированных в rescue_responses
: 9343 , там есть пример кода.
IЯ думаю, что это слишком много, чтобы перезаписать весь класс, поэтому я решил переопределить его метод log_error
, отвечающий за ошибки регистрации.
lib/ext/suppress_exceptions.rb
:
module Ext
module SuppressExceptions
private
def log_error(_request, wrapper)
exception = wrapper.exception
return if ActionDispatch::ExceptionWrapper.rescue_responses.key? exception.class.name
super
end
end
end
config/initializers/error_handling.rb
:
require_dependency 'ext/suppress_exceptions'
ActiveSupport.on_load(:action_controller) do
ActionDispatch::DebugExceptions.prepend Ext::SuppressExceptions
end