Ich möchte die aktuelle Rückverfolgung (Stacktrace) in einer Rails 3-App ohne Ausnahme protokollieren . Irgendeine Idee wie?
Warum will ich das? Ich versuche, die Aufrufe zu verfolgen, die getätigt werden, wenn Rails nach einer Vorlage sucht, damit ich einen Teil des Prozesses auswählen kann, der überschrieben werden soll (weil ich den Ansichtspfad für einen bestimmten Controller meiner Unterklasse ändern möchte).
Ich möchte es aus der Datei aufrufen : gems\actionpack-3.2.3\lib\action_dispatch\middleware\templates\rescues\missing_template.erb
. Ich weiß, dass dies keine bewährte Methode ist, aber ich weiß, dass sie sich hinter dem Stapel befindet, von dem aus die Suche nach Vorlagen erfolgt.
ruby
stack-trace
JellicleCat
quelle
quelle
e.backtrace
. Ich habe es in einem der Projekte gesehen, mit denen ich arbeite. Nicht der schönste Ansatz, aber es funktioniert. Ich hoffe jedoch, eine bessere Lösung von jemand anderem zu hören.Antworten:
Sie können verwenden
Kernel#caller
:Ausgabe:
quelle
Kernel.caller
- mit einem Punkt?Kernel.new.caller
ist hier nicht definiertcaller
handelt es sich um eine Instanzmethode. Da dasKernel
Modul in jeder Ruby-Klasse enthalten ist (außerBasicObject
in 1.9), ist es als Instanzmethode für jedes Objekt verfügbar (es ist jedoch privat). Sie können es nichtKernel.new.caller
einfach so aufrufen, weil Sie ein Modul nicht instanziieren können (es hat keinenew
Methode).Rails.logger.debug caller.join("\n")
oderputs caller.join("\n")
. Vielen Dank.Versuchen Sie es mit
quelle
Kernel#caller
die aktuelle Methode weggelassen wird . ZBMyClass.new.returns_caller => ["(irb):42:in 'irb_binding'",...]
ist nicht so hilfreich wieMyClass.new.returns_thread_backtrace => ["(irb):38:in 'backtrace'","(irb):38:in 'returns_thread_backtrace'","(irb):43:in 'irb_binding'",...]
Ich benutze dies, um eine benutzerdefinierte Fehlerseite anzuzeigen, wenn eine Ausnahme ausgelöst wird.
quelle