Je souhaite enregistrer le backtrace actuel (stacktrace) dans une application Rails 3 sans qu'une exception ne se produise. Une idée comment?
Pourquoi est-ce que je veux ça? J'essaie de tracer les appels qui sont effectués lorsque Rails recherche un modèle afin de pouvoir choisir une partie du processus à remplacer (car je veux changer le chemin de vue pour un contrôleur sous-classé particulier).
Je voudrais appeler à partir du fichier: gems\actionpack-3.2.3\lib\action_dispatch\middleware\templates\rescues\missing_template.erb
. Je sais que ce n'est pas la meilleure pratique, mais je sais que c'est en aval de la pile d'où la recherche de modèles a lieu.
ruby
stack-trace
JellicleCat
la source
la source
e.backtrace
. Je l'ai vu dans l'un des projets avec lesquels je travaille. Pas la meilleure approche, mais ça marche. J'espère cependant entendre une meilleure solution de quelqu'un d'autre.Réponses:
Vous pouvez utiliser
Kernel#caller
:Production:
la source
Kernel.caller
- avec un point?Kernel.new.caller
n'est pas défini icicaller
une méthode d'instance. Puisque leKernel
module est inclus dans chaque classe Ruby (saufBasicObject
dans 1.9), il est disponible en tant que méthode d'instance sur n'importe quel objet (il est cependant privé). Vous ne pouvez pas l'appeler aussiKernel.new.caller
simplement parce que vous ne pouvez pas instancier un module (il n'a pas denew
méthode).Rails.logger.debug caller.join("\n")
ouputs caller.join("\n")
. Merci.Essayez d'utiliser
la source
Kernel#caller
la méthode actuelle. Par exemple,MyClass.new.returns_caller => ["(irb):42:in 'irb_binding'",...]
n'est pas aussi utile queMyClass.new.returns_thread_backtrace => ["(irb):38:in 'backtrace'","(irb):38:in 'returns_thread_backtrace'","(irb):43:in 'irb_binding'",...]
J'utilise ceci pour afficher une page d'erreur personnalisée lorsqu'une exception est déclenchée.
la source