gpt4 book ai didi

ruby-on-rails - 在 ActiveSupport::LogSubscriber 子类中访问 Rails 请求

转载 作者:行者123 更新时间:2023-12-01 01:03:19 24 4
gpt4 key购买 nike

我正在尝试制作一些最终将记录到数据库的自定义 Rails 记录器。但是,我无法访问我非常想拥有的请求对象之类的东西。

我目前正在尝试使用 LogSubscriber(通知)接口(interface)来完成大部分工作;也许这不是正确的做法。我知道我可以滥用 Thread.current[] 但我希望避免这样做。

这是我拥有的代码,作为示例,它是最基本的。这是在初始化程序中加载的。

module RequestLogging
class LogSubscriber < ActiveSupport::LogSubscriber
def process_action(event)
pp request # <--- does not work
pp event
end
end

RequestLogging::LogSubscriber.attach_to :action_controller

最佳答案

可能您需要覆盖 process_action在 ActionController::Instrumentation 中,然后请求对象将可访问,如 event.payload[:request] .我认为您可以将代码放在 config/initializers 中的某处,代码示例:

ActionController::Instrumentation.class_eval do
def process_action(*args)
raw_payload = {
controller: self.class.name,
action: self.action_name,
params: request.filtered_parameters,
format: request.format.try(:ref),
method: request.method,
path: (request.fullpath rescue "unknown"),
request: request,
session: session
}

ActiveSupport::Notifications.instrument("start_processing.action_controller", raw_payload.dup)

ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
result = super
payload[:status] = response.status
append_info_to_payload(payload)
result
end
end
end

关于ruby-on-rails - 在 ActiveSupport::LogSubscriber 子类中访问 Rails 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21082699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com