2013-08-22 23 views
8

Używam rails-api do budowy API bez interfejsu sieciowego. Kiedy dostaję błędy w rozwoju, chciałbym zobaczyć tylko komunikat o błędzie i stacktrace w postaci zwykłego tekstu bez całego zawijania HTML. Jak przesłonić obsługę wyjątków globalnych, aby renderować stos w trybie programowania w postaci zwykłego tekstu/JSON i generyczny komunikat o błędzie podczas produkcji?Jak uzyskać wyjątki, aby renderować wersję tekstową strony błędu programisty Rails?

Odpowiedz

3

Sugerowałbym, że włączenie śledzenia stosu w kodzie produkcyjnym prawdopodobnie nie jest dobrym pomysłem z punktu widzenia bezpieczeństwa.

Oto jak zrobiłbym to:

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

Mam nadzieję, że to pomaga.

Po wyjaśnieniu Sama mogę dodać:

W kontrolerze bazowej dla API (prawdopodobnie 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 

Zastrzeżenie: może nie chcieć, aby uratować od każdego wyjątku w ten sposób, ale tak byś to zrobił, gdybyś to zrobił.

+1

muszę wyjaśnić kwestię - Pytam tylko dla trybu rozwoju i ... jak nadpisać odpowiedź globalnie. –

+2

Myślę, że 'stacktrace' jest literówką i powinien być' backtrace'. – Jacob

2

Niektóre ulepszenia ponad @donleyp odpowiedzi na uzyskanie czystego śladu w Rails 3.2 i wyjścia rodzajowej informacji o błędzie w produkcji:

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