تقديم: سلمان لا يقبل خيارات
-
03-07-2019 - |
سؤال
وأحب أن استخدام 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