2010-07-29 9 views
10

Ho un'app Rails che include un'interfaccia API JSON. Quando i valori sono specificati correttamente, il controller gestisce correttamente il percorso felice e JSON viene reso come output.Come gestisco gli errori o le cattive richieste nella mia API Rails Rails?

Tuttavia, se si verifica un problema con l'input, viene sollevata un'eccezione e vengono visualizzati alcuni modelli in rescues. Mi piacerebbe davvero restituire un errore JSON lungo le linee { "error": { "msg": "bad request", "params": ... } } e il codice di stato HTTP appropriato (ad esempio 403 se non erano autenticati). Ma voglio solo che questo sia applicabile alle richieste contro qualsiasi cosa in example.com/api/....

Come posso farlo?

risposta

4

Che ne dici di un around_filter sul controller api. Qualcosa di simile

around_filter :my_filter 

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

ho avuto un caso simile, ma salvato singoli metodi API separatamente perché avevo bisogno errori specifici del metodo, ho anche potuto avere più salvataggi a seconda del tipo di errore.

nel mio controller dell'applicazione, ho avuto un metodo:

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

Poi, nel mio controller API

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

perché io salverò l'errore, avevo bisogno di chiamare in modo esplicito alle API hoptoad.

per gestire l'autenticazione, ho avuto un before_filter per login_required

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

e di salvare 404 errori:

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

Spero che questo aiuta!

+0

Anch'io sono d'accordo con te perché questo è il modo migliore per eseguire errori personalizzati anche per azioni diverse –

+0

Solo una nota, ma potresti invece eseguire 'rendering: json => {...}' piuttosto che 'render : js => {...} ' –

Problemi correlati