Frage

Ich würde gerne render :json verwenden, aber es scheint, es ist nicht so flexibel. Was ist der richtige Weg, dies zu tun?

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
War es hilfreich?

Lösung

Ich habe etwas Ähnliches mit render :json getan. Dies ist, was für mich gearbeitet:

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

Andere Tipps

Ich denke, dieser Artikel kann Ihnen nützlich sein - Rails to_json oder as_json durch? Jonathan Julian.

Der Hauptgedanke ist, dass Sie sollten mit to_json in Controllern vermeiden. Es ist viel flexibler as_json Methode in Ihrem Modell zu definieren.

Zum Beispiel:

Ihr Ding Modell

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

Und dann können Sie in Ihrem Controller schreiben Sie einfach

render :json => @things

Das Management komplexes Hashes in Ihren Controller wird hässlich schnell.

Mit Rails 3 können Sie ActiveModel :: Serializer verwenden. Siehe http://api.rubyonrails.org/classes/ActiveModel/Serialization.html

Wenn Sie etwas nicht-trivial tun, sehen https://github.com/rails-api/active_model_serializers . Ich empfehle separate Serializer Klassen Erstellung Ihre Modelle zu vermeiden unübersichtlich und machen Tests zu erleichtern.

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

bei Array, was ich getan ist

respond_to do |format|
  format.html
  format.json {render :json => {:medias => @medias.to_json, :total => 13000, :time => 0.0001 }}
end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top