Quiero registrar la traza inversa actual (stacktrace) en una aplicación Rails 3 sin que ocurra una excepción. ¿Alguna idea de cómo?
¿Por qué quiero esto? Estoy tratando de rastrear las llamadas que se realizan cuando Rails busca una plantilla para poder elegir una parte del proceso para anular (porque quiero cambiar la ruta de vista para un controlador mío subclasificado en particular).
Me gustaría llamarlo desde el archivo: gems\actionpack-3.2.3\lib\action_dispatch\middleware\templates\rescues\missing_template.erb
. Sé que esa no es la mejor práctica, pero sé que está aguas abajo de la pila desde donde ocurre la búsqueda de plantillas.
ruby
stack-trace
JellicleCat
fuente
fuente
e.backtrace
. Lo he visto en uno de los proyectos con los que estoy trabajando. No es el mejor enfoque, pero funciona. Sin embargo, espero escuchar una mejor solución de otra persona.Respuestas:
Puedes usar
Kernel#caller
:Salida:
fuente
Kernel.caller
, con un punto?Kernel.new.caller
no está definido aquícaller
es un método de instancia. Como elKernel
módulo se incluye en cada clase de Ruby (exceptoBasicObject
en 1.9), está disponible como método de instancia en cualquier objeto (aunque es privado). No puede llamarloKernel.new.caller
simplemente porque no puede crear una instancia de un módulo (no tienenew
método).Rails.logger.debug caller.join("\n")
oputs caller.join("\n")
. Gracias.Intenta usar
fuente
Kernel#caller
omite el método actual. Por ejemplo,MyClass.new.returns_caller => ["(irb):42:in 'irb_binding'",...]
no es tan útil comoMyClass.new.returns_thread_backtrace => ["(irb):38:in 'backtrace'","(irb):38:in 'returns_thread_backtrace'","(irb):43:in 'irb_binding'",...]
Lo uso para mostrar una página de error personalizada cuando se generan excepciones.
fuente