2011-08-23 13 views
5

Por defecto llamando rails.model.to_json¿Cómo puedo personalizar el error de validación de Rails 3 json?

mostrará algo como esto:

{"name":["can't be blank"],"email":["can't be blank"],"phone":["can't be blank"]} 

En lugar de mensaje que necesito para generar un código de estado que podría ser utilizado en el cliente del servicio:

[{"field": "name", "code": "blank"}, {"field": "email", "code": "blank"}] 

Este enfoque es muy similar a los errores de github api v3 - http://developer.github.com/v3/

¿Cómo puedo lograr esto con Rail s?

+0

Otra pregunta similar. http://stackoverflow.com/questions/5911470/api-errors-customization-for-rails-3-like-github-api-v3. También sin respuesta = \ –

+0

En este hilo, los rieles "Respondedores" se utilizan para lograr eso. http://stackoverflow.com/questions/5911470/api-errors-customization-for-rails-3-like-github-api-v3 –

Respuesta

0

En el modelo se puede modificar la forma como JSON opera. Por ejemplo, supongamos que tiene un modelo ActiveRecord Contact. Puede anular as_json para modificar el comportamiento de representación.

def Contact < ActiveRecord::Base 

    def as_json 
    hash = super 

    hash.collect {|key, value| 
     {"field" => key, "code" => determine_code_from(value)} 
    } 
    end 

end 

Por supuesto, también se puede generar el JSON en un método separado en Contact o incluso en el controlador. Simplemente tendrías que modificar ligeramente tu método de renderizado.

render @contact.as_my_custom_json 
+0

El valor es una cadena como esta "No puede estar en blanco". Puede que haya alguna forma de obtener el tipo de error en lugar del mensaje. –

+0

¿Qué quiere decir con el tipo de error? Todas las validaciones generan el mismo error. La clave es el campo que causa el error y el valor es el mensaje. ¿Qué quiere que sea el "código" en su ejemplo? – diedthreetimes

+0

Si no utiliza el mensaje "No puede estar en blanco" para cualquier otra cosa, simplemente anule el mensaje en su clase de modelo para que sea el código que desea que sea. Por ejemplo, 'validates_numercality_of: zip_code," 320 "' – diedthreetimes

0

En su controlador, cuando se renderiza la salida, en su caso, el contenido de JSON, agregue lo siguiente:

render :json => @yourobject, :status => 422 # or whatever status you want. 

Esperanza esto ayuda

+0

Dominic, he preguntado sobre un problema diferente. Lo siento si mi pregunta no fue clara. –

+0

Y todavía no está claro, porque con mi solución tienes exactamente lo que pediste (http://developer.github.com/v3/). Tendrá algo así como: HTTP/1.1 400 Bad Request Content-Length: 35 {"message": "Problemas al analizar JSON"} –

+0

Hay una respuesta con una matriz de errores. Estoy preguntando sobre eso. –

Cuestiones relacionadas