سؤال

وأحب أن استخدام render :json ولكن يبدو ليست مرنة قدر. ماذا يكون الطريق الصحيح للقيام بذلك؟

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
هل كانت مفيدة؟

المحلول

ولقد فعلت شيئا من هذا القبيل مع render :json. هذا هو ما عملت بالنسبة لي:

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

نصائح أخرى

وأعتقد أن هذا المادة يمكن أن تكون مفيدة بالنسبة لك - القضبان to_json أو as_json قبل؟ جوناثان جوليان.

والفكر الرئيسي هو أنه يجب تجنب استخدام to_json في وحدات تحكم. ومن أكثر مرونة لتحديد طريقة as_json في النموذج الخاص بك.

وعلى سبيل المثال:

في نموذج الشيء الخاص بك

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

وبعد ذلك يمكن أن تكتب في وحدة التحكم الخاصة بك فقط

render :json => @things

إدارة التجزئة المعقدة في وحدات التحكم الخاصة بك يحصل القبيح بسرعة.

ومع القضبان 3، يمكنك استخدام ActiveModel :: مسلسل. انظر http://api.rubyonrails.org/classes/ActiveModel/Serialization.html

إذا كنت تفعل أي شيء غير تافهة، انظر https://github.com/rails-api/active_model_serializers . أنا نوصي بإنشاء فصول مسلسل منفصلة لتجنب التبعثر النماذج الخاصة بك وجعل الاختبارات أسهل.

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

وفي حالة مجموعة ما فعلت هو

respond_to do |format|
  format.html
  format.json {render :json => {:medias => @medias.to_json, :total => 13000, :time => 0.0001 }}
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top