Ruby on Rails: Wie listen Sie die Teilpfade auf, die für eine Seite gerendert werden?

7

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?

    
sjsc 18.03.2013, 02:30
quelle

4 Antworten

15

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:

%Vor%

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 :

erstellen %Vor%

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%     
Ryan Bigg 18.03.2013, 03:33
quelle
4

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:

%Vor%

Und wo immer Sie diese Informationen anzeigen wollten, könnten Sie diese Hilfsmethode verwenden:

%Vor%     
PinnyM 18.03.2013 03:28
quelle
2

Weitere Informationen zum Debuggen finden Sie in rails-footnotes

    
DGM 18.03.2013 04:24
quelle
2

Sie können auch das RailsPanel überprüfen, das eine Chrome-Erweiterung ist.

    
Agis 18.03.2013 14:21
quelle