Ich möchte die Teiltöne für jede Seite in meiner App auflisten. Wenn beispielsweise die Seite app / tasks / index.html.erb angezeigt wird, möchte ich dem Benutzer Folgendes anzeigen:
Für diese Seite gerenderte Partials:
tasks / _list.html.erb
Aufgaben / _button.html.erb
Aufgaben / _navigation.html.erb
Gibt es eine Möglichkeit, dies in Ruby on Rails zu tun?
Ja, es gibt so einen vollkommenen Weg, dies in Rails zu tun!
Wie bdares in seinem Kommentar darauf hingewiesen hat, erscheinen die Zeilen für das Template-Rendering in den Protokollen. Aber wie kommen sie überhaupt dorthin? Nun, das hat etwas mit einem kleinen Etwas im Active Support namens LogSubscriber
zu tun. Die Dokumentation dafür ist ziemlich gründlich:
ActiveSupport :: LogSubscriber ist ein Objekt, das ActiveSupport :: Notifications mit dem einzigen Zweck verwendet, sie zu protokollieren. Der Protokollteilnehmer sendet basierend auf dem angegebenen Namespace Benachrichtigungen an ein registriertes Objekt.
Die Zeile "Gerendert ..." in den Protokollen ist ActionView::LogSubscriber
, was wie in Rails 3.2 . Nimm dir einen Moment, um den Code zu lesen. Es ist schön und ordentlich.
Damit abonnieren Sie einige Ereignisse in Rails, nämlich die Methoden render_template
, render_partial
und render_collection
. Dazu wird die Methode ActiveSupport::LogSubscriber.attach_to
aufgerufen, die einigen Ereignissen einen Protokollteilnehmer anfügt. Diese Methode ist auch interessant und so definiert:
Ich habe diesen Code in die richtige Reihenfolge gebracht, weil er für unsere Interessen äußerst relevant ist . Was das tut, ist subscribe
für das Objekt notifier
aufzurufen. Das Objekt notifier
ist standardmäßig ActiveSupport::Notifications
, was wichtig zu merken ist. Die Dokumentation für diese Klasse in Rails befindet sich ebenfalls in der API .
Wenn subscribe
aufgerufen wird, wird der Name des event
übergeben. Was ist das? Nun, es ist jede einzelne öffentliche Methode in der Klasse. Wenn die Unterklasse LogSubscriber
definiert ist, definiert sie ein paar öffentliche Methoden: render_template
, render_partial
und render_collection
. Dies sind die Ereignisse, die für diesen Protokollteilnehmer abonniert werden.
Nun, das ist für unsere Interessen relevant, weil wir das gleiche verwenden werden, um diese Ereignisse in der Ansicht zu abonnieren. Der erste Schritt besteht darin, ActiveSupport::Notfications
zuzulassen, dass wir alle partiellen Renderereignisse abonnieren möchten. Wir können dies tun, indem wir ein neues before_filter
in ApplicationController
:
Das Ereignis, das wir abonnieren, ist das render_partial
-Ereignis im action_view
-Namespace, das genau eines der Ereignisse ist, die ActionView::LogSubscriber
abonniert. Was passiert, wenn ein partielles gerendert wird, ist, dass dieser Block in einigen Daten aufgerufen und übergeben wird.
event_name
: Der Name des Ereignisses.
start_at
: Die Startzeit des Ereignisses.
end_at
: Die Zeit, zu der das Ereignis endete.
id
: Ein eindeutiger Bezeichner für dieses Ereignis.
payload
: Einige Nutzinformationen zu diesem Ereignis.
Wenn der Hook aufgerufen wird, fügt er den identifier
-Schlüssel von payload
zu dem Array hinzu, das am Anfang der Methode definiert ist.
Dann in der Ansicht, um auf eine Liste von diesen zuzugreifen, können Sie dies tun:
%Vor%Das folgende Beispiel aus der Benachrichtigungs-API sollte Ihnen helfen:
%Vor% Für Ihren Fall (Tracking gerenderter Teiltöne) möchten Sie die Benachrichtigung 'render_partial.action_view'
. Ihr Code könnte etwa so aussehen:
Und wo immer Sie diese Informationen anzeigen wollten, könnten Sie diese Hilfsmethode verwenden:
%Vor%Sie können auch das RailsPanel überprüfen, das eine Chrome-Erweiterung ist.
Tags und Links ruby ruby-on-rails-3 ruby-on-rails