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
)
Gibt es Gründe, zu bevorzugen '(method.to_s + "_with_profiling") intern' über'. "# {Methode} _with_profiling" '? – tadman
nicht wirklich, ich werde es aufräumen –