2009-03-04 31 views
27

render :json'u kullanmayı çok isterim ama esnek değil gibi görünüyor. Bunu yapmanın doğru yolu nedir?render: json seçenekleri kabul etmiyor

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 

cevap

39

render :json ile benzer bir şey yaptım. Bu benim için çalıştı budur:

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

Teşekkürler, bu da bana yardımcı oldu. – swilliams

+0

Bana da yardım etti. +1 – sscirrus

1
format.json { render @things.to_json(:include => :photos) } 
34
Ben bu yazı sizin için yararlı olabilir tahmin

- Jonathan Julian tarafından Rails to_json or as_json?. Ana düşünce, to_json'u denetleyicilerinde kullanmaktan kaçınmanız gerektiğidir. Modelinizde as_json yöntemini tanımlamak çok daha esnektir.

Örneğin

: En Şey modeline

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

yılında

Sonra ne yaptım sadece

render :json => @things 
+0

Bu muhtemelen bu sorun için en iyi çözümdür. – giosakti

+2

Diğer olası geçiş seçeneklerini korumak için super (options.merge (: include =>: photos)) 'yapmak isteyebilir. Yine de, herhangi bir ': include' seçeneklerini geçersiz kılarsınız, ancak ... bu anahtarın değerlerini birleştirmek için mantık biraz daha ilgili olacaktır. –

+0

'süper options.reverse_merge kullanma: include =>: photos'," default "seçeneğini geçersiz kılmanıza izin verir: include. (Bkz. [Hash # reverse_merge] (http://api.rubyonrails.org/classes/Hash.html#method-i-reverse_merge)) – Steve

1

dizinin ihtimaline karşı denetleyicisi yazabilirsiniz

respond_to do |format| 
    format.html 
    format.json {render :json => {:medias => @medias.to_json, :total => 13000, :time => 0.0001 }} 
end 
3

Denetleyicilerindeki karmaşık karmaları yönetmek çirkin bir şekilde hızlanır.

Raylar 3 ile ActiveModel :: Serializer'ı kullanabilirsiniz. Önemsiz bir şey yapıyor iseniz, https://github.com/rails-api/active_model_serializers numaralı telefona bakın. Modellerinizi karıştırmamak ve testleri kolaylaştırmak için ayrı seri hale getirici sınıflar oluşturmanızı öneriyorum.

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 
İlgili konular