Pregunta

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

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
¿Fue útil?

Solución

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

Otros consejos

Supongo que este artículo puede ser útil para usted: Rails to_json or as_json? por Jonathan julian

El pensamiento principal es que debes evitar usar to_json en los controladores. Es mucho más flexible definir el método as_json en su modelo.

Por ejemplo:

En tu modelo Thing

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

Y luego puedes escribir en tu controlador solo

render :json => @things

La gestión de hashes complejos en tus controladores se pone fea rápidamente.

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

Si estás haciendo algo no trivial, mira https://github.com/rails-api/active_model_serializers . Recomiendo crear clases de serializador separadas para evitar abarrotar tus 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
format.json { render @things.to_json(:include => :photos) }

en caso de matriz lo que hice es

respond_to do |format|
  format.html
  format.json {render :json => {:medias => @medias.to_json, :total => 13000, :time => 0.0001 }}
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top