2009-03-04 13 views
27

Me encantaría usar render :json pero parece que no es tan flexible. ¿Cuál es la forma correcta de hacer esto?render: json no acepta opciones

respond_to do |format| 
    format.html # index.html.erb 
    format.xml { render :xml => @things } 

    #This is great 
    format.json { render :text => @things.to_json(:include => :photos) } 

    #This doesn't include photos 
    format.json { render :json => @things, :include => :photos } 
end 

Respuesta

39

He hecho algo similar con render :json. Esto es lo que funcionó para mí:

respond_to do |format| 
    format.html # index.html.erb 
    format.json { render :json => @things.to_json(:include => { :photos => { :only => [:id, :url] } }) } 
end 
+0

Gracias, esto me ayudó también. – swilliams

+0

me ayudó también. +1 – sscirrus

1
format.json { render @things.to_json(:include => :photos) } 
34

supongo que este artículo puede ser útil para usted - Rails to_json or as_json? por Jonathan Julian.

La idea principal es que debe evitar el uso de to_json en los controladores. Es mucho más flexible definir el método as_json en su modelo.

Por ejemplo:

En su modelo cosa

def as_json(options={}) 
    super(:include => :photos) 
end 

Y entonces se puede escribir en su controlador solo

render :json => @things 
+0

esta es probablemente la mejor solución para este problema .. – giosakti

+2

Puede que quiera 'super (options.merge (: include =>: photos))' para conservar otras opciones posibles de transferencia. Sin embargo, todavía anularías cualquier opción ': include' ... la lógica para fusionar valores para esa clave se involucraría un poco más. –

+0

El uso de 'super options.reverse_merge: include =>: photos' le permitiría anular el" predeterminado ": include. (Consulte [Hash # reverse_merge] (http://api.rubyonrails.org/classes/Hash.html#method-i-reverse_merge)) – Steve

1

en el caso de la matriz de lo que he hecho es

respond_to do |format| 
    format.html 
    format.json {render :json => {:medias => @medias.to_json, :total => 13000, :time => 0.0001 }} 
end 
3

Gestionar hashes complejos en sus controladores se pone feo rápidamente.

Con Rails 3, puede usar ActiveModel :: Serializer. Ver http://api.rubyonrails.org/classes/ActiveModel/Serialization.html

Si está haciendo algo no trivial, vea https://github.com/rails-api/active_model_serializers. Recomiendo crear clases de serializador por separado para evitar abarrotar sus modelos y facilitar las pruebas.

class ThingSerializer < ActiveModel::Serializer 
    has_many :photos 
    attributes :name, :whatever 
end 

# ThingsController 
def index 
    render :json => @things 
end 

# test it out 
thing = Thing.new :name => "bob" 
ThingSerializer.new(thing, nil).to_json