2011-06-28 22 views
7

En una aplicación Rails tengo una acción que devuelve una representación json de una colección de diferentes modelos. Parece algo como esto:Rails 3 responda a json, con atributos/métodos personalizados

respond_to :json 

def index 
    @cars = Car.all 
    @vans = Van.all 
    respond_with({ 
    :cars => @cars, 
    :vans => @vans 
    }) 
end 

Sin embargo, quiero personalizar los atributos y métodos que se pasan al objeto JSON. Un poco como:

respond_with({ 
    :cars => @cars.to_json(:only => [:make, :model], :methods => [:full_name]), 
    :vans => @vans 
}) 

hacer lo anterior, hace que la representación JSON de los "coches" ser escapado como una cadena grande, como:

{ 
    "cars":"[{\"car\":{\"make\":\"Ford\" ... etc 
    "vans": [{"van":{"make":"Citreon" ... vans not escaped 
} 

Obviamente me estoy acercando a mal . ¿Alguien puede señalarme en la dirección correcta?

Respuesta

12

Puesto que usted está anidando el to_json en otro Hash, creo que es necesario utilizar as_json (que devuelve un Hash en lugar de un String) en su lugar:

respond_with({ 
    :cars => @cars.as_json(:only => [:make, :model], :methods => [:full_name]), 
    :vans => @vans 
}) 
+0

el clavo! Gracias. (aceptará esta respuesta tan pronto como me sea permitido) – aaronrussell