以下是一些历史记录。截至 2021 年 6 月 25 日,我对 Rails 的 PR https://github.com/rails/rails/pull/42592 已被接受,此功能将在 Rails 6.1.5 中提供
方法 1
很想从应用程序的 Rails 堆栈中删除 DebugExceptions 中间件。
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 中注册的日志记录异常,其中有一个示例代码。
我觉得覆盖整个类太过分了,所以我选择覆盖它负责记录错误的method 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