Я хочу записать текущую обратную трассировку (stacktrace) в приложении Rails 3 без исключений. Есть идеи как?
Зачем мне это? Я пытаюсь отследить вызовы, которые выполняются, когда Rails ищет шаблон, чтобы я мог выбрать часть процесса, которую нужно переопределить (потому что я хочу изменить путь представления для конкретного моего подклассного контроллера).
Я хотел бы назвать его из файла: gems\actionpack-3.2.3\lib\action_dispatch\middleware\templates\rescues\missing_template.erb
. Я знаю, что это не лучшая практика, но я знаю, что это нисходящий поток от стека, где происходит поиск шаблонов.
ruby
stack-trace
JellicleCat
источник
источник
e.backtrace
. Я видел это в одном из проектов, с которыми я работаю. Не самый хороший подход, но он работает. Надеюсь услышать лучшее решение от кого-то еще.Ответы:
Вы можете использовать
Kernel#caller
:Вывод:
источник
Kernel.caller
- с точкой?Kernel.new.caller
здесь не определеноcaller
это метод экземпляра. ПосколькуKernel
модуль включен в каждый класс Ruby (кромеBasicObject
версии 1.9), он доступен как метод экземпляра для любого объекта (хотя он и закрытый). Вы не можете вызвать его такKernel.new.caller
просто, потому что не можете создать экземпляр модуля (у него нетnew
метода).Rails.logger.debug caller.join("\n")
илиputs caller.join("\n")
. Спасибо.Попробуйте использовать
источник
Kernel#caller
как текущий метод не учитывается. НапримерMyClass.new.returns_caller => ["(irb):42:in 'irb_binding'",...]
, не так полезно, какMyClass.new.returns_thread_backtrace => ["(irb):38:in 'backtrace'","(irb):38:in 'returns_thread_backtrace'","(irb):43:in 'irb_binding'",...]
Я использую это, чтобы показать пользовательскую страницу ошибки при возникновении исключения.
источник