web-dev-qa-db-ja.com

render:jsonはオプションを受け入れません

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
27
Alex Wayne

render :jsonで似たようなことをしました。これは私のために働いたものです:

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

この記事はあなたに役立つと思います- Rails to_json or as_json? by Jonathan Julian。

主な考えは、コントローラーでto_jsonを使用しないようにすることです。モデルでas_jsonメソッドを定義する方がはるかに柔軟です。

例えば:

あなたのThingモデルで

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

そして、あなたはちょうどあなたのコントローラに書き込むことができます

render :json => @things
35
cutalion

コントローラーで複雑なハッシュを管理することは、醜く速くなります。

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
3
tee

配列の場合、私がしたことは

respond_to do |format|
  format.html
  format.json {render :json => {:medias => @medias.to_json, :total => 13000, :time => 0.0001 }}
end
1
Bank
format.json { render @things.to_json(:include => :photos) }
1
Darren