Obtenir la trace de la stack actuelle dans Ruby sans déclencher une exception

Je veux enregistrer la trace actuelle (stacktrace) dans une application Rails 3 sans qu’une exception se produise. Une idée de comment?

Pourquoi est-ce que je veux ça? J’essaie de retracer les appels effectués lorsque Rails recherche un modèle afin de pouvoir choisir une partie du processus à remplacer (car je souhaite modifier le chemin de vue d’un sous-contrôleur particulier).

Je voudrais l’appeler depuis le fichier: gems\actionpack-3.2.3\lib\action_dispatch\middleware\templates\rescues\missing_template.erb . Je sais que ce n’est pas la meilleure pratique, mais je sais que c’est en aval de la stack d’où provient la recherche de modèles.

Vous pouvez utiliser l’ Kernel#caller :

 # /tmp/caller.rb def foo puts caller # Kernel#caller returns an array of ssortingngs end def bar foo end def baz bar end baz 

Sortie:

 caller.rb:8:in `bar' caller.rb:12:in `baz' caller.rb:15:in `
'

Essayez d’utiliser

 Thread.current.backtrace 

Je l’utilise pour afficher une page d’erreur personnalisée lorsque l’exception est déclenchée.

 rescue_from Exception do |exception| logger.error exception.class logger.error exception.message logger.error exception.backtrace.join "\n" @exception = exception # ExceptionNotifier::Notifier.exception_notification env, @exception respond_to do |format| if [AbstractController::ActionNotFound, ActiveRecord::RecordNotFound, ActionController::RoutingError, ActionController::UnknownAction].include?(exception.class) format.html { render :template => "errors/404", :status => 404 } format.js { render :nothing => true, :status => 404 } format.xml { render :nothing => true, :status => 404 } elsif exception.class == CanCan::AccessDenied format.html { render :template => "errors/401", :status => 401 #, :layout => 'application' } # format.js { render :json => { :errors => [exception.message] }, :status => 401 } # format.js { render :js => 'alert("Hello 401")' } format.js { render :template => 'errors/401.js.erb' } else ExceptionNotifier::Notifier.exception_notification(env, exception).deliver format.html { render :template => "errors/500", :status => 500 } #, :layout => 'im2/application' } # format.js { render :nothing => true, :status => 500 } format.js { render :template => 'errors/500.js.erb' } end end end