2013-08-22 11 views
8

Ich verwende Rails-API, um eine API ohne Web-Schnittstelle zu erstellen. Wenn ich Fehler in der Entwicklung bekomme, würde ich gerne nur die Fehlermeldung und Stacktrace im Klartext sehen, ohne das ganze HTML-Wrapping. Wie überschreibe ich die globale Ausnahmebehandlung, sodass das Stacktrace im Entwicklungsmodus in Nur-Text/JSON gerendert wird, und eine generische Fehlermeldung in der Produktion?Wie erhalte ich Ausnahmen, um eine reine Textversion der Rails-Entwicklungsfehlerseite zu rendern?

Antwort

3

Ich würde vorschlagen, dass das Einschließen des Stack-Trace im Produktionscode aus Sicherheitsgründen wahrscheinlich keine gute Idee ist.

Hier ist, wie ich es tun würde:

render :json => {message:exception.message, stack_trace: exception.stacktrace} 

Ich hoffe, das hilft.

Nach Sams Klärung kann ich hinzufügen:

In Ihren Basis-Controller für Ihre API (wahrscheinlich Application):

class ApplicationController < ActionController::Base 
    ... 
    rescue_from Exception do |exception| 
     error = {message:exception.message} 
     error[:stack_trace] = exception.stacktrace if Rails.env.development? 
     render :json => error 
    end 
    ... 
end 

Caveat: Sie können nicht von jeder einzelnen Ausnahme auf diese Weise retten wollen, aber So würdest du es tun, wenn du es tätest.

+1

ich die Frage klären soll - ich bin nur für Entwicklungsmodus zu fragen ... und Wie überschreibt man die Antwort global? –

+2

Ich denke 'Stacktrace' ist ein Tippfehler und sollte' backtrace' sein. – Jacob

2

Einige Verbesserungen gegenüber @donleyp Antwort auf eine saubere Spur in Rails 3.2 und Ausgang allgemeine Fehlerinformationen in der Produktion erhalten:

class ApplicationController < ActionController::API 
    ... 
    rescue_from Exception do |exception| 
     if Rails.env.development? 
      error = {message:exception.message} 
      error[:application_trace] = Rails.backtrace_cleaner.clean(exception.backtrace) 
      error[:full_trace] = exception.backtrace 
      render :json => error 
     else 
      render :text => "Internal server error.", :status => 500 
     end 
    end 
    ...  
end