Chcę rejestrować bieżący ślad śledzenia (stacktrace) w aplikacji Rails 3 bez wystąpienia wyjątku. Każdy pomysł jak?
Dlaczego tego chcę? Próbuję prześledzić wywołania, które są wykonywane, gdy Railsy szukają szablonu, aby móc wybrać część procesu do przesłonięcia (ponieważ chcę zmienić ścieżkę widoku dla określonego mojego kontrolera podklasy).
Chciałbym wywołać ją z pliku: gems\actionpack-3.2.3\lib\action_dispatch\middleware\templates\rescues\missing_template.erb
. Wiem, że to nie jest najlepsza praktyka, ale wiem, że jest to poniżej stosu, z którego następuje wyszukiwanie szablonów.
ruby
stack-trace
JellicleCat
źródło
źródło
e.backtrace
. Widziałem to w jednym z projektów, nad którymi pracuję. Nie jest to najmilsze podejście, ale działa. Mam jednak nadzieję, że ktoś inny usłyszy lepsze rozwiązanie.Odpowiedzi:
Możesz użyć
Kernel#caller
:Wynik:
źródło
Kernel.caller
- z kropką?Kernel.new.caller
nie jest tutaj zdefiniowanecaller
jest to metoda instancji. PonieważKernel
moduł jest zawarty w każdej klasie Ruby (z wyjątkiemBasicObject
1.9), jest dostępny jako metoda instancji na każdym obiekcie (chociaż jest prywatny). Nie możesz tego wywołać takKernel.new.caller
po prostu, ponieważ nie możesz utworzyć instancji modułu (nie ma onnew
metody).Rails.logger.debug caller.join("\n")
lubputs caller.join("\n")
. Dzięki.Spróbuj użyć
źródło
Kernel#caller
pomija bieżącą metodę. Np.MyClass.new.returns_caller => ["(irb):42:in 'irb_binding'",...]
Nie jest tak pomocny jakMyClass.new.returns_thread_backtrace => ["(irb):38:in 'backtrace'","(irb):38:in 'returns_thread_backtrace'","(irb):43:in 'irb_binding'",...]
Używam tego, aby wyświetlić niestandardową stronę błędu, gdy zostanie zgłoszony wyjątek.
źródło