def attach_to(namespace, log_subscriber=new, notifier=ActiveSupport::Notifications)
log_subscribers << log_subscriber
@@flushable_loggers = nil
log_subscriber.public_methods(false).each do |event|
next if 'call' == event.to_s
notifier.subscribe("#{event}.#{namespace}", log_subscriber)
end
end
。これは、notifier
オブジェクトでsubscribe
を呼び出すことです。 notifier
オブジェクトは、デフォルトではActiveSupport::Notifications
です。これは覚えておくことが重要です。 documentation for that class in Rails is in the API too。
subscribe
が呼び出されると、event
の名前を通過します。これは何ですか?まあ、それはクラス内のすべての単一のパブリックメソッドです。LogSubscriber
サブクラスが定義されている場合、それはいくつかのパブリックメソッド、すなわちrender_template
,render_partial
およびrender_collection
を定義します。これらは、このログサブスクライバに対してサブスクライブされるイベントです。私たちはビュー内のこれらのイベントをサブスクライブするために同じものを使用するつもりので
さて、それは私たちの利益に関連するのです。最初のステップでは、ActiveSupport::Notfications
に、すべて部分レンダリングイベントを購読したいと考えています。私たちはApplicationController
内に新しいbefore_filter
を作成することによってこれを行うことができます。
before_filter :log_partial_events
def log_partial_events
@partial_events = []
ActiveSupport::Notifications.subscribe("render_partial.action_view") do |event_name, start_at, end_at, id, payload|
@partial_events << payload[:identifier]
end
我々はサブスクライブしているイベントが正確ActionView::LogSubscriber
がに加入しているイベントの一つであるaction_view
名前空間内render_partial
イベントです。部分的にレンダリングされると、このブロックが呼び出され、いくつかのデータが渡されるということが起こります。
event_name
:イベントの名前。 start_at
:イベントが開始された時間。 end_at
:イベントが終了した時刻。 id
:このイベントの一意の識別子。 :このイベントに関するペイロード情報。
フックが呼び出されると、メソッドの先頭に定義されている配列にのidentifier
キーが追加されます。あなたがこれを行うことができますこれらのリストにアクセスするためのビューで次に
、このようなデバッグ情報をたくさんのために
<%= debug @partial_events %>
私は確かに、サーバーログにはほぼ正確な行が印刷されていると考えています。私はミドルウェアスタックを見始めるだろう。 – bdares
@bdares:ミドルウェアスタックにはない。これは計器コールです。 –