如何向现有的通知负载中添加属性?

8
在Rails通知中,我订阅了"process_action.action_controller",并想要添加更多属性到有效载荷中。我该如何做?
我尝试使用append_info_to_payload,但似乎没有效果。
module AppendExceptionPayload
  module ControllerRuntime
    extend ActiveSupport::Concern

    protected 

    def append_info_to_payload(payload)
      super
      payload[:happy] = "HAPPY"
    end
  end
end

订阅和以上代码位于Rails引擎中,因此在这里我进行调用以添加它:
require 'append_exception_payload'

module Instrument
  class Engine < ::Rails::Engine

    ActiveSupport.on_load :action_controller do
      include AppendExceptionPayload::ControllerRuntime
    end

  end
end

我猜这没起作用是因为包含一个模块不会覆盖现有的方法。尝试使用prepend而不是include - Akinori MUSHA
2个回答

11

我发布了悬赏后,我自己找到了解决方案。Rails 处理这个非常干净利落。

基本上,append_info_to_payload 方法就是专门用来处理这个的。

所以为了包含会话信息和已登录用户信息,我在我的application_controller.rb中添加了以下内容:

def append_info_to_payload(payload)
    super
    payload[:session] = request.session_options[:id] rescue ""
    payload[:user_id] = session[:user_id] rescue "unknown"
end

2
所以我跳进去看了 process_action 方法(私有)append_info_to_payload 实例方法(公共) 的 API,proccess action 方法似乎在其代码中调用 append_info_to_payload,如下所示:
ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
    result = super
    payload[:status] = response.status
    append_info_to_payload(payload)
    result
  end

"append_info_to_payload的工作原理大致如下"
def append_info_to_payload(payload) #:nodoc:
  payload[:view_runtime] = view_runtime
end

我可以建议尝试使用payload[:view_runtime]而不是payload[:happy],或者尝试使用payload[:status]。请告诉我你的进展如何,我会尽力帮助你,不幸的是这方面真的没有文档资料。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接