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?
8
A
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ł.
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
muszę wyjaśnić kwestię - Pytam tylko dla trybu rozwoju i ... jak nadpisać odpowiedź globalnie. –
Myślę, że 'stacktrace' jest literówką i powinien być' backtrace'. – Jacob