我正在探索ActiveSupport::Notifications,并希望订阅Rails异常,比如ActiveRecord::ActiveRecordError异常。类似这样。
ActiveSupport::Notifications.subscribe /ActiveRecordError/ do |*args|
# More code here ...
end
这个订阅将存在于第三方的 gem中,所以我不能灵活地用 "应用内 "的 beginrescueend来包装我的 AcitveRecord调用。一个潜在的问题是,Exceptions是否被认为是或处理为事件,可以被订阅?
异常不作为ActiveSupport通知处理,完整的列表可以在这里找到。https:/guides.rubyonrails.orgactive_supportinstrumentation.html。.
然而,你可以钩入 ActionController
中的一个轨交。
module YourGem
module Rails
class Railtie < ::Rails::Railtie
config.after_initialize do
ActiveSupport.on_load(:action_controller) do
rescue_from ActiveRecord::RecordNotFound, with: :record_not_found
private
def record_not_found(exception)
ActiveSupport::Notifications.instrument "my.custom.event", this: :data do
# do your custom stuff here
end
end
end
end
end
end
end
使用这种方法,你可能甚至不需要ActiveSupport通知,只需要在救援中执行你的代码即可?