2011-05-06 9 views
8

Estoy agregando una API en una aplicación Rails3 y está funcionando bastante bien. pero vi la siguiente versión 3 del API en Github http://developer.github.com/v3/Personalización de errores Api para Rails 3 como Github api v3

HTTP/1.1 422 Unprocessable Entity 
Content-Length: 149 

{ 
    "message": "Validation Failed", 
    "errors": [ 
    { 
     "resource": "Issue", 
     "field": "title", 
     "code": "missing_field" 
    } 
    ] 
} 

Me gustó la estructura de los mensajes de error. Pero no pude hacer que se reproduzca. ¿Cómo puedo hacer mi apis para que la respuesta me guste?

+0

Tiene el mismo problema. ¿Lo has resuelto? –

+0

Lo hice al crear la clase de excepción personalizada. – Autodidact

+0

¿Aún puede usar la validación de los rieles incorporados con esta clase de excepción personalizada? ¿No has blogueado al respecto? –

Respuesta

2

Puede lograr fácilmente ese formato de error agregando un ActionController :: Responder para su formato JSON. Consulte http://api.rubyonrails.org/classes/ActionController/Responder.html para obtener la documentación (extremadamente vaga) de esta clase, pero en pocas palabras, debe anular el método to_json.

En el siguiente ejemplo estoy llamando a un método privado en un ActionController: Respondedor que construirá la respuesta json, incluida la respuesta de error personalizada de su elección; todo lo que tienes que hacer es llenar los vacíos, realmente:

def to_json 
    json, status = response_data 
    render :json => json, :status => status 
end 

def response_data 
    status = options[:status] || 200 
    message = options[:notice] || '' 
    data = options[:data] || [] 

    if data.blank? && !resource.blank? 
    if has_errors? 
     # Do whatever you need to your response to make this happen. 
     # You'll generally just want to munge resource.errors here into the format you want. 
    else 
     # Do something here for other types of responses. 
    end 
    end 

    hash_for_json = { :data => data, :message => message } 

    [hash_for_json, status] 
end 
+0

entonces ... ¿dónde colocaste este código? –

+0

@MarkMurphy Lo teníamos en el directorio 'lib'. Ver http://stackoverflow.com/questions/5995178/where-should-custom-responders-go-in-a-rails-project que confirma esto. –