Pergunta

Eu adoraria usar render :json mas parece que não é tão flexível. O que é o caminho certo para fazer isso?

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
Foi útil?

Solução

Eu tenho feito algo semelhante com render :json. Isto é o que funcionou para mim:

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

Outras dicas

Eu acho que este artigo pode ser útil para você -? Rails to_json ou as_json por Jonathan Julian.

A idéia principal é que você deve evitar usar to_json em controladores. É muito mais flexível para definir método as_json no seu modelo.

Por exemplo:

Em seu modelo Coisa

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

E, em seguida, você pode escrever em seu controlador apenas

render :json => @things

Gerenciamento de hashes complexos em seus controladores recebe rápido feio.

Com Rails 3, você pode usar ActiveModel :: Serializer. Consulte http://api.rubyonrails.org/classes/ActiveModel/Serialization.html

Se você está fazendo qualquer coisa não-trivial, veja https://github.com/rails-api/active_model_serializers . Eu recomendo a criação de classes do serializador separados para evitar desordenar seus modelos e testes facilitar.

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) }

em caso de série que eu fiz é

respond_to do |format|
  format.html
  format.json {render :json => {:medias => @medias.to_json, :total => 13000, :time => 0.0001 }}
end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top