SORU
3 NİSAN 2010, CUMARTESİ


Nasıl Raylar to_json geçersiz kılmak için?


Güncelleme:

Bu sorunu düzgün bir şekilde incelenmiştir. Asıl mesele render :json içinde yatıyor.

Asıl soruya ilk kodu yapıştırın beklenen sonucu verecektir. Ancak, yine de bir uyarı var. Örnek:

render :json => current_user

DEĞİLaynı gibi

render :json => current_user.to_json

Bu otomatik olarak to_json yöntemi Kullanıcı ile ilişkili nesne arayacak, render :json.Aslındato_json User model üzerinde geçersiz kılınırsa,, render :json => @user ArgumentError aşağıda açıklanan oluşturur.

Özet

# works if User#to_json is not overridden
render :json => current_user

# If User#to_json is overridden, User requires explicit call
render :json => current_user.to_json

Bu bana aptalca geliyor. Bu 19 ** türü belirtildiğinde render aslında Model#to_json arıyor aksini söyleyerek gibi görünüyor. Birisi gerçekten burada neler döndüğünü açıklayabilir mi?

Bu büyük olasılıkla diğer soruma cevap verebilir bana yardımcı olabilecek herhangi bir genii: How to build a JSON response by combining @foo.to_json(options) and @bars.to_json(options) in Rails


Orijinal Soru:

Bu YÜZDEN diğer bazı örnekler gördüm ama benim aradığım şey yok.

Çalışıyorum:

class User < ActiveRecord::Base

  # this actually works! (see update summary above)
  def to_json
    super(:only => :username, :methods => [:foo, :bar])
  end

end

ArgumentError: wrong number of arguments (1 for 0) alıyorum

/usr/lib/ruby/gems/1.9.1/gems/activesupport-2.3.5/lib/active_support/json/encoders/object.rb:4:in `to_json

Herhangi bir fikir?

CEVAP
4 NİSAN 2010, Pazar


to_json bir parametre options karma ile geçersiz kılınması gerekiyor çünkü ArgumentError: wrong number of arguments (1 for 0) alıyorsanız.

def to_json(options)
  ...
end

Uzun to_json, as_json ve render açıklama:

2.3.3, as_json gibi sorunları gidermek için eklenmiştir ActiveSupport karşılaştığım.yaratılışbu json ayrı olmalıdırişlemejson.

Şimdi, ne zaman to_json nesne veri yapısı oluşturmak için çağrılır çağrılır ve sonra karma bir JSON dize ActiveSupport::json.encode kullanma olarak kodlanır. Bu her türlü olur: nesne, sayısal, tarih, dize, vb (ActiveSupport bakın kod).

Nesneler aynı şekilde davranır ActiveRecord. Modelin tüm özellikleri içeren bir hash oluşturur as_json standart bir uygulama var.Modelinizi as_json istediğiniz JSON yapısını oluşturmak için geçersiz kılmak gerekir. Özellikleri ve yöntemleri vardır belirtebilirsiniz nereye as_json eski gibi to_json bir seçenek alır bildirimli karma.

def as_json(options)
  # this example ignores the user's options
  super(:only => [:email, :handle])
end

, render :json => o Denetleyici olarak kabul edebileceği bir dize veya bir nesne.Eğer bir dize ise, yukarıda açıklandığı gibi bir nesne varsa, to_json denir, as_json tetikler yanıt gövde olarak geçti.

Yani, modelleriniz düzgün as_json geçersiz kılar ile temsil edildiği sürece (ya da değil), bir model görünümü denetleyicisi kodunuzu bu gibi görünmelidir:

format.json { render :json => @user }

Hikayenin ahlaki:to_json doğrudan render bunu yapmak için izin arama kaçının. Eğer JSON çıktısını optimize etmek gerekiyorsa, as_json Ara.

format.json { render :json => 
    @user.as_json(:only => [:username], :methods => [:avatar]) }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Rickymon Tero

    Rickymon Ter

    1 Ocak 2007
  • talkandroid

    talkandroid

    27 Mayıs 2010
  • tseyina

    tseyina

    2 AĞUSTOS 2006