2012-01-20 11 views
10

Bir RAils 3.1 uygulamasından "type" niteliği içeren bir nesne döndürürken, "type" özelliği dahil edilmez. Varsayalım:json response_with "type" niteliği dahil Rails 3.1

İlgili STI tablosu ile bir model. Modeller Hayvanı Kaldıran Kedi, Köpek ve Balık. JSON aracılığıyla bir hayvan döndürürken

, ben "tip" sütunu eklemek isteyen, ancak bu olmuyor:

jQuery.ajax("http://localhost:3001/animals/1", {dataType: "json"}); 

verim: Bu gibi görünüyor

responseText: "{"can_swim":false,"created_at":"2012-01-20T17:55:16Z","id":1,"name":"Fluffy","updated_at":"2012-01-20T17:55:16Z","weight":9.0}" 

bir sorundur to_json:

bash-3.2$ rails runner 'p Animal.first.to_yaml' 
"--- !ruby/object:Cat\nattributes:\n id: 1\n type: Cat\n weight: 9.0\n name: Fluffy\n can_swim: false\n created_at: 2012-01-20 17:55:16.090646000 Z\n updated_at: 2012-01-20 17:55:16.090646000 Z\n" 

bash-3.2$ rails runner 'p Animal.first.to_json' 
"{\"can_swim\":false,\"created_at\":\"2012-01-20T17:55:16Z\",\"id\":1,\"name\":\"Fluffy\",\"updated_at\":\"2012-01-20T17:55:16Z\",\"weight\":9.0}" 

Bu davranışın ardındaki mantığı ve bunu nasıl geçersiz kılacağını bilen var mı?

cevap

6

as_json yöntemini geçersiz kılın. Çıkışı üretmek için to_json tarafından kullanılır.

+0

Mükemmel ayarlanmış ekler, teşekkür - Bu hileye neden olabilir! – cyrusd

+5

Bu, artıklığı azaltmak için güzel bir uzlaşma gibi gözüküyor: def as_json (seçenekler = {}) {tür: tür} .merge süper son – cyrusd

+0

As_json'u geçersiz kılmayı seviyorum çünkü nesneleri gerçekten JSON'a nasıl dönüştürdüğümü biliyorum ve sadece gerçekten dönüştürmem gerekenleri dönüştürüyorum. – lucapette

0

Şunun gibi bir şey yapabilirsiniz: Rails 2.3.12'de yukarıdakiler işe yaramaz.

elimden (elbette benim Modeli olarak) böyle bir şey yapmak:

class Registration < ActiveRecord::Base 

    def as_json(options={}) 
    super(options.merge(:include => [:type])) 
    end 

end 

Ama bu böyle bir hata oluşturması to_json neden olur:

NoMethodError: undefined method `serializable_hash' for "Registration":String 

ben bu çevrede çalıştık Punches Ben uygulamama Yani

class Registration < ActiveRecord::Base 

    def as_json(options={}) 
    super(options.merge(:include => [:type])) 
    end 

    def type 
    r = self.attributes["type"] 
    def r.serializable_hash(arg) 
     self 
    end 
    r 
    end 
end 

vermek istediğiniz nesnenin üzerine bu yöntem olan bu, ben bir içine bu koyduk mixin: Modelimin Sınıf (lar) içinde

module RailsStiModel 
    # The following two methods add the "type" parameter to the to_json output. 
    # see also: 
    # http://stackoverflow.com/questions/8945846/including-type-attribute-in-json-respond-with-rails-3-1/15293715#15293715 
    def as_json(options={}) 
    super(options.merge(:include => [:type])) 
    end 

    def type 
    r = self.attributes["type"] 
    def r.serializable_hash(arg) 
     self 
    end 
    r 
    end 
end 

Ve şimdi, ekleyin:

include RailsStiModel 
0

İşte as_json orijinal özelliğini tutabilir benim çözümdür.

14

Yaptığım şey budur. Sadece sonuca eksik type

def as_json(options={}) 
    super(options.merge({:methods => :type})) 
    end 
İlgili konular