2010-08-26 814 views
7

Tengo algunos datos en Rails que quiero representar como datos JSON. Lo que estoy haciendo ahora es simplemente encontrar todas las instancias de un Modelo y llamar a render: json => data.Rieles que representan datos JSON con Model Root

data = Data.find(:all) 
render :json => data 

Sin embargo, Rails incluye el nombre del modelo en cada objeto JSON. Así que mis datos JSON termina pareciéndose a esto:

[{modelname:{propertyName: 'value',...}},{modelname:{propertyName: 'value2',...}}] 

en lugar de esto: [{propertyName: 'valor', ...}, {propertyName: 'valor2', ...}]

El nombre del modelo es siempre el mismo y no quiero que esté allí.

Cambié la opción para representar la raíz en los datos JSON en uno de los inicializadores de Rieles, pero eso afecta a todo lo que quiero que se represente como JSON, lo cual no quiero hacer para este proyecto.

En este caso, quiero poder hacer esto caso por caso.

¿Cómo puedo hacer esto? Gracias por adelantado.

Respuesta

2

No he encontrado una forma de hacerlo pasando opciones al método to_json (y no creo que exista tal opción). Tienes más alternativa para hacer esto, cualquier clase que herede de ActiveRecord :: Base tendrá include_root_in_json.

Haga algo como esto.

Data.include_root_in_json = false 
data = Data.find(:all) 
render :json => data 

Espero que esto te ponga en marcha.

Ok, probemos esto entonces.

DataController < ApplicationControlle 

    private 

    def custom_json(data) 
    Data.include_root_in_json = false 
    data.to_json 
    Data.include_root_in_json = true 
    data 
    end 
end 

A continuación, el redireccionamiento se vería así

data = Data.find(:all) 
render :json => custom_json(data) 

Es bastante tonto código Me gustaría poder pensar en otra cosa. Déjame preguntarte esto: ¿qué pasa con tener el nombre del modelo incluido en los datos json?

+0

Acabo de probar esto, y tiene el efecto de cambiar include_root_in_json a false globalmente, desafortunadamente. Estoy ejecutando Rails 2.3.5, si eso ayuda. – CCSab

1

Con Rails 3, encontré esta manera mejor de hacer. Anular el as_json en su modelo y hacerlo de la siguiente manera:

def as_json(options = {}) 
    super(options.merge :methods => [:some_method_that_you_want_to_include_result], :include => {:child_relation => {:include => :grand_child_relation } }) 
end 
12

con los carriles 3, puede utilizar active_model_serializers joya 1

que le permite especificar la representación sin raíces de un objeto como éste:

render :json => data, :root => false 
+0

Esto funcionó muy bien para mí, aunque ese período probablemente debería ser una coma? – stickwithjosh

+1

Gracias, respuesta editada para tener una coma –