рендер: JSON не принимает параметры - PullRequest
27 голосов
/ 04 марта 2009

Я бы с удовольствием использовал 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

Ответы [ 5 ]

39 голосов
/ 05 марта 2009

Я сделал нечто подобное с render :json. Вот что у меня сработало:

respond_to do |format|
    format.html # index.html.erb
    format.json  { render :json => @things.to_json(:include => { :photos => { :only => [:id, :url] } }) }
end
35 голосов
/ 12 апреля 2011

Полагаю, эта статья может быть вам полезна - Rails to_json или as_json? Джонатана Джулиана

Основная мысль заключается в том, что вам следует избегать использования to_json в контроллерах. Намного более гибкий способ определения метода as_json в вашей модели.

Например:

В твоей модели Thing

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

И тогда вы можете написать в свой контроллер просто

render :json => @things
3 голосов
/ 30 декабря 2011

Управление сложными хешами в ваших контроллерах становится ужасно быстрым.

В 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
1 голос
/ 01 декабря 2011

в случае массива, что я сделал, это

respond_to do |format|
  format.html
  format.json {render :json => {:medias => @medias.to_json, :total => 13000, :time => 0.0001 }}
end
1 голос
/ 22 декабря 2010
format.json { render @things.to_json(:include => :photos) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...