Desejo registrar o backtrace atual (stacktrace) em um aplicativo Rails 3 sem que ocorra uma exceção. Alguma idéia de como?
Por que eu quero isso? Estou tentando rastrear as chamadas feitas quando o Rails procura um modelo para poder escolher uma parte do processo a ser substituída (porque quero alterar o caminho de exibição de um controlador subclasse específico meu).
Eu gostaria de chamá-lo a partir do arquivo: gems\actionpack-3.2.3\lib\action_dispatch\middleware\templates\rescues\missing_template.erb
. Sei que não é uma prática recomendada, mas sei que é a jusante da pilha de onde ocorre a pesquisa de modelos.
ruby
stack-trace
JellicleCat
fonte
fonte
e.backtrace
. Eu já vi isso em um dos projetos com os quais estou trabalhando. Não é a melhor abordagem, mas funciona. Espero ouvir uma solução melhor de outra pessoa, no entanto.Respostas:
Você pode usar
Kernel#caller
:Resultado:
fonte
Kernel.caller
- com um ponto?Kernel.new.caller
não está definido aquicaller
é um método de instância. Como oKernel
módulo está incluído em todas as classes Ruby (excetoBasicObject
no 1.9), ele está disponível como método de instância em qualquer objeto (embora seja privado). Você não pode chamá-loKernel.new.caller
simplesmente porque não pode instanciar um módulo (ele não possuinew
método).Rails.logger.debug caller.join("\n")
ouputs caller.join("\n")
. Obrigado.Tente usar
fonte
Kernel#caller
deixa de fora o método atual. Por exemplo,MyClass.new.returns_caller => ["(irb):42:in 'irb_binding'",...]
não é tão útil quantoMyClass.new.returns_thread_backtrace => ["(irb):38:in 'backtrace'","(irb):38:in 'returns_thread_backtrace'","(irb):43:in 'irb_binding'",...]
Eu uso isso para mostrar uma página de erro personalizada quando exceções são geradas.
fonte