¿Cómo obtener “Rastreo de aplicación” en lugar de un rastreo detallado hacia arriba en Rails?

En la página de error predeterminada de Rails del entorno de desarrollo, puede ver tres backtraces, 1. Application Trace, 2. Framework Trace y 3. Full Trace.

Pero, ¿cómo puedo obtener “Application Trace” en los controladores Rails? Full Trace (exception.backtrace) es demasiado para mí. Ahora estoy haciendo así:

exception.backtrace.select {|line| line =~ /myappname/i } 

¿Es esta una forma correcta? ¿O hay otras maneras geniales de conseguirlo?

Busqué fonts de Rails para ver cómo se implementa. ActionSupport tiene una clase de BacktraceCleaner , que es autodescriptible, supongo. Al ActionDispatch::ExceptionWrapper , Rails agrega filtros a los backtraces: en ActionDispatch::ExceptionWrapper :

 def application_trace clean_backtrace(:silent) end def framework_trace clean_backtrace(:noise) end def full_trace clean_backtrace(:all) end 

clean_backtrace resulta estar llamando método clean en la instancia de BacktraceCleaner (disponible para los usuarios en Rails.backtrace_cleaner ), que, a su vez, solo aplica filtros. Puedes leer rails/active_support/lib/active_support/backtrace_cleaner.rb para ver cómo se implementa, te aseguro que es muy simple.

Los filtros reales para el railties/lib/rails/backtrace_cleaner.rb aplicación se definen en railties/lib/rails/backtrace_cleaner.rb :

 module Rails class BacktraceCleaner < ActiveSupport::BacktraceCleaner APP_DIRS_PATTERN = /^\/?(app|config|lib|test)/ RENDER_TEMPLATE_PATTERN = /:in `_render_template_\w*'/ def initialize super add_filter { |line| line.sub("#{Rails.root}/", '') } add_filter { |line| line.sub(RENDER_TEMPLATE_PATTERN, '') } add_filter { |line| line.sub('./', '/') } # for tests add_gem_filters add_silencer { |line| line !~ APP_DIRS_PATTERN } end private def add_gem_filters gems_paths = (Gem.path | [Gem.default_dir]).map { |p| Regexp.escape(p) } return if gems_paths.empty? gems_regexp = %r{(#{gems_paths.join('|')})/gems/([^/]+)-([\w.]+)/(.*)} add_filter { |line| line.sub(gems_regexp, '\2 (\3) \4') } end end end 

Y add_silencer , verificando APP_DIRS_PATTERN = /^\/?(app|config|lib|test)/ nos dice que estuvo bastante cerca 🙂 no se confunda con los filtros: simplemente cortan la ruta completa a los archivos.

Habiendo entristecido eso, te sugiero que uses Rails.backtrace_cleaner para el trabajo. Es la forma más fresca que estás buscando.