2010-07-29 14 views
10

Tengo una aplicación Rails que incluye una interfaz API JSON. Cuando los valores se especifican correctamente, el controlador maneja bien la ruta feliz y JSON se representa como salida.¿Cómo manejo los errores o las solicitudes incorrectas en mi API REST de Rails?

Sin embargo, si hay un problema con la entrada, se genera una excepción y en su lugar se muestran algunas plantillas en rescues. Realmente me gustaría devolver un error JSON a lo largo de las líneas { "error": { "msg": "bad request", "params": ... } } y el código de estado HTTP apropiado (por ejemplo, 403 si no fueron autenticados). Pero solo quiero que esto se aplique a las solicitudes en contra de cualquier cosa en example.com/api/....

¿Cómo puedo hacer eso?

Respuesta

4

¿Qué tal un around_filter en su controlador api. Algo así como

around_filter :my_filter 

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

tuve un caso similar, pero rescatado los métodos de la API individuales por separado porque necesitaba errores específicos del método, que también podría tener múltiples rescates en función del tipo de error.

en mi controlador de aplicación, tenía un método:

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

Luego, en mi controlador de API

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

porque rescato el error, que tenía que llamar explícitamente a la API hoptoad.

autenticación de manejar, que tenía un before_filter para login_required

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

Y para rescatar a los errores 404:

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

espero que esto ayude!

+0

Yo también estoy de acuerdo con usted en esto ya que esta es la mejor manera de generar errores personalizados también para diferentes acciones –

+0

Solo una nota, pero podría hacer 'render: json => {...}' en lugar de 'render : js => {...} ' –

Cuestiones relacionadas