27 votes

rendu :json n'accepte pas les options

J'aimerais utiliser render :json mais il semble que ce n'est pas aussi flexible. Quel est la bonne façon de le faire?

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

39voto

Justin Gallagher Points 2514

J'ai fait quelque chose de similaire avec render :json. C'est ce qui a fonctionné pour moi:

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

35voto

cutalion Points 2147

Je suppose que cet article peut être utile pour vous - Rails to_json ou as_json? par Jonathan Julien.

Le principal est que vous devriez éviter d'utiliser des to_json dans les contrôleurs. Il est beaucoup plus souple pour définir as_json méthode dans votre modèle.

Par exemple:

Dans votre modèle de Chose

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

Et puis, vous pouvez écrire dans votre contrôleur de juste

render :json => @things

3voto

tee Points 2030

La gestion complexe des hachages dans vos contrôleurs devient laid rapide.

Avec Rails 3, vous pouvez utiliser Activerecord::Sérialiseur. Voir http://api.rubyonrails.org/classes/ActiveModel/Serialization.html

Si vous faites quelque chose de non trivial, voir https://github.com/rails-api/active_model_serializers. Je vous recommande de créer séparé sérialiseur classes pour ne pas encombrer vos modèles, et de faire des tests plus facile.

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

1voto

Darren Points 1099
format.json { render @things.to_json(:include => :photos) }

1voto

Bank Points 800

dans le cas de la matrice de ce que j'ai fait est

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X