2014-02-24 2 views
5

In Rails Standard-Fehlerseite der Entwicklungsumgebung können Sie drei Backtraces anzeigen, 1. Application Trace, 2. Framework Trace und 3. Full Trace.Wie bekomme ich "Application Trace" statt vollständige verbose Backtrace in Rails?

Aber wie bekomme ich "Application Trace" in Rails-Controller. Full Trace (exception.backtrace) ist zu viel für mich. Jetzt bin ich wie dies zu tun:

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

Ist das eine richtige Art und Weise? Oder gibt es andere coolere Möglichkeiten, um es zu bekommen?

Antwort

8

Ich schaute Schienen Quellen, um zu sehen, wie es implementiert ist. ActionSupport hat Klasse BacktraceCleaner, die selbst beschreibbar ist, denke ich. Mit ihm Rails fügt Filter Backtraces: in 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 stellt sich heraus zu rufen clean Methode auf Instanz von BacktraceCleaner (für die Nutzer in Rails.backtrace_cleaner), die wiederum nur Filter gilt. Sie können lesen rails/active_support/lib/active_support/backtrace_cleaner.rb, um zu sehen, wie es implementiert ist, kann ich Ihnen versichern, es ist sehr einfach.

Actual Filter für die Anwendung Backtrace in railties/lib/rails/backtrace_cleaner.rb definiert sind:

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 

Und add_silencer, für APP_DIRS_PATTERN = /^\/?(app|config|lib|test)/ Überprüfung sagt uns, dass Sie ziemlich nah :) war durch Filter werden nicht verwirrt: sie vollständigen Pfad gerade geschnitten zu Dateien.

Haben Sie das traurig, schlage ich vor, Sie verwenden Rails.backtrace_cleaner für den Job. Es ist cooler Weg, den Sie suchen

+4

lobanovadik, ja das ist es! Ich habe gerade, was ich in einer Codezeile brauchte! 'Rails.backtrace_cleaner.clean (exception.backtrace)' Und ich habe auch bemerkt, dass es 'config/initializers/backtrace_silencers.rb' standardmäßig gibt. Vielleicht sollte ich das verwenden, aber trotzdem vielen Dank! – chikaram

Verwandte Themen