2

Wir portieren MiniProfiler nach Ruby und wollten automatische Instrumentierung für Rails-Ansichten und Partials hinzufügen.Warum kann diese Methode ActionView :: Template: render nicht instrumentieren?

Ich bin mir der existing instrumentation Unterstützung bewusst, möchte aber idealerweise "Start" - und "Stop" -Ereignisse erhalten. Wir möchten auch frühere Versionen von Rails unterstützen, die keine Benachrichtigungsunterstützung haben.

def prof(klass, method) 
    with_profiling = (method.to_s + "_with_profiling").intern 
    without_profiling = (method.to_s + "_without_profiling").intern 

    klass.send :alias_method, without_profiling, method 
    klass.send :define_method, with_profiling do |*args, &orig| 
    puts "before #{method} #{args}" 
    self.send without_profiling, *args, &orig 
    puts "after #{method}" 
    end 
    klass.send :alias_method, method, with_profiling 
end 

prof ActionView::Template, :render 

Sobald jedoch wird diese aktiviert render nicht richtig instrumentiert: bis machen mit vor und nach Anrufe

gehackt ich eine kurze instrumenter und getestet Einhaken. Insbesondere arbeitet diese einige auf der partials, aber explodiert mit:

ActionView :: Template :: Fehler (nicht definierte Methode `html_safe‘ für nil: NilClass)

Was mit dieser falsch ist Methodenhaken? Was für eine richtige robuste Art und Weise ist es, Methoden Haken, so dass sie für dieses Problem nicht zerbrechlich sind (die Aufrechterhaltung der trivialen API: prof klass, method)

+0

Gibt es Gründe, zu bevorzugen '(method.to_s + "_with_profiling") intern' über'. "# {Methode} _with_profiling" '? – tadman

+0

nicht wirklich, ich werde es aufräumen –

Antwort

2

Sie haben die Methode neu definiert das Ergebnis Ihrer endgültigen puts zurückzukehren, die in der Regel nil ist. Ein Update könnte sein:

klass.send :define_method, with_profiling do |*args, &orig| 
    puts "before #{method} #{args}" 
    result = self.send without_profiling, *args, &rig 
    puts "after #{method}" 

    result 
end 
+0

wow ... kann nicht glauben, dass ich es verpasst habe, das wird mich lernen, eine Pause von Ruby zu machen :) –

+0

jetzt die Follow-up-Frage muss ich fragen, wie man ein bekommt Name der gesunden Ansicht vom Haken –