2013-08-22 7 views
8

Sto usando rails-api per creare un'API senza interfaccia web. Quando ricevo errori nello sviluppo, mi piacerebbe vedere solo il messaggio di errore e lo stacktrace in testo normale senza tutto il wrapping HTML. Come sovrascrivere la gestione globale delle eccezioni in modo da rendere lo stacktrace in modalità di sviluppo in testo semplice/JSON e un messaggio di errore generico in produzione?Come ottengo delle eccezioni per il rendering di una versione in chiaro della pagina degli errori di sviluppo di Rails?

risposta

3

Suggerirei che includere l'analisi dello stack nel codice di produzione non è probabilmente una buona idea dal punto di vista della sicurezza.

Ecco come lo farei:

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

Spero che questo aiuta.

Dopo la chiarificazione di Sam posso aggiungere:

Nel vostro controller di base per il vostro API (probabilmente ApplicationController):

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: Non si può decidere di salvare da ogni singola eccezione in questo modo, ma questo è come lo faresti se lo facessi.

+1

vorrei chiarire la questione - che sto chiedendo modalità di sviluppo solo ... e come sovrascrivere la risposta a livello globale. –

+2

Penso che 'stacktrace' sia un refuso e dovrebbe essere' backtrace'. – Jacob

2

alcuni miglioramenti rispetto risposta @donleyp per ottenere una traccia pulita in Rails 3.2 e uscita generica informazioni di errore nella produzione:

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 
Problemi correlati