Ответ 1
Я сделал что-то подобное с render :json
. Это то, что сработало для меня:
respond_to do |format|
format.html # index.html.erb
format.json { render :json => @things.to_json(:include => { :photos => { :only => [:id, :url] } }) }
end
Я бы хотел использовать 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
Я думаю, эта статья может быть полезна для вас - Rails to_json или as_json? Джонатана Джулиана.
Основная мысль заключается в том, что вам следует избегать использования to_json в контроллерах. Гораздо более гибко определять метод as_json в вашей модели.
Например:
В вашей модели Thing
def as_json(options={})
super(:include => :photos)
end
И тогда вы можете написать в своем контроллере только
render :json => @things
Управление сложными хэшами в ваших контроллерах становится ужасно быстрым.
С Rails 3 вы можете использовать ActiveModel:: Serializer. См. 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