2010-07-29 18 views
10

Mam aplikację Rails, która zawiera interfejs API JSON. Gdy wartości są poprawnie określone, kontroler radzi sobie ze szczęśliwą ścieżką, a JSON jest renderowany jako wyjście.Jak radzić sobie z błędami lub złymi żądaniami w moim Railsowym interfejsie REST?

Jednak, jeśli wystąpił problem z danymi wejściowymi, zgłaszany jest wyjątek, a zamiast niego są wyświetlane niektóre szablony w wersji rescues. Naprawdę po prostu chciałbym zwrócić błąd JSON zgodny z { "error": { "msg": "bad request", "params": ... } } i odpowiedni kod statusu HTTP (na przykład 403, jeśli nie zostały uwierzytelnione). Ale chcę tylko, żeby to było odpowiednie dla żądań przeciwko wszystkim w example.com/api/....

Jak mogę to zrobić?

Odpowiedz

4

Co powiesz na around_filter na kontrolerze api. Coś jak

around_filter :my_filter 

private 
def my_filter 
    begin 
    yield 
    rescue 
    render :js => ... 
    end 
end 
13

miałem podobny przypadek, ale uratowany poszczególnych metod API osobno, bo potrzebne konkretne błędy metodzie, ja też może mieć wiele ratuje zależności od rodzaju błędu.

w moim kontroler aplikacji, miałem metody:

def error(status, code, message) 
    render :js => {:response_type => "ERROR", :response_code => code, :message => message}.to_json, :status => status 
end 

Wtedy w moim kontrolera API

def some_method 
    ## do stuff 
rescue 
    error(500, method_specific_error_code, "it all done broke") 
    ## additional error notifications here if necessary. 
end 

bo ratowania błąd, musiałem jawnie wywołać API hoptoad.

uwierzytelniania Aby obsłużyć, miałem before_filter dla login_required

def login_required 
    error(403, 403, "Not Authenticated") unless authenticated 
end 

i uratować 404 błędy:

def render_404 
    error(404, 404, "Unknown method") 
end 

Mam nadzieję, że to pomoże!

+0

Ja też się z tobą zgadzam, ponieważ jest to najlepszy sposób renderowania błędów niestandardowych również dla różnych akcji. –

+0

Tylko uwaga, ale zamiast tego możesz zamiast tego zrobić 'render: json => {...}' : js => {...} ' –

Powiązane problemy