2010-11-18 16 views
0

Çalıştığım şey, bazı model nesneleri veritabanından almak ve bunları xml'ye serileştirmektir, ancak belirli bir (has_many) ilişkilendirmeyi eklerken aşağıdaki hatayı alıyorum. JSON serileştirme (to_json) bir sorun olmadan çalışır (özellikleri de dahil). Ayrıca bir nesnenin serileştirilmesi (XML ve JSON). Sorun ne olabilir? (Model sınıfı herhangi bir XML serileştirme işlemini geçersiz kılmaz, Rails 3 kullanıyorum). İşteNoMethodError, to_xml serileştirirken

komut:
Entity.all.to_xml :include => :properties

ve dökümü:

 
NoMethodError: undefined method `macro' for nil:NilClass 
    from /home/kai/.rvm/gems/[email protected]/gems/activesupport-3.0.1/lib/active_support/whiny_nil.rb:48:in `method_missing' 
    from /home/kai/.rvm/gems/[email protected]/gems/activerecord-3.0.1/lib/active_record/serialization.rb:41:in `serializable_add_includes' 
    from /home/kai/.rvm/gems/[email protected]/gems/activerecord-3.0.1/lib/active_record/serialization.rb:40:in `each' 
    from /home/kai/.rvm/gems/[email protected]/gems/activerecord-3.0.1/lib/active_record/serialization.rb:40:in `serializable_add_includes' 
    from /home/kai/.rvm/gems/[email protected]/gems/activerecord-3.0.1/lib/active_record/serializers/xml_serializer.rb:191:in `send' 
    from /home/kai/.rvm/gems/[email protected]/gems/activerecord-3.0.1/lib/active_record/serializers/xml_serializer.rb:191:in `add_includes' 
    from /home/kai/.rvm/gems/[email protected]/gems/activerecord-3.0.1/lib/active_record/serializers/xml_serializer.rb:186:in `add_extra_behavior' 
    from /home/kai/.rvm/gems/[email protected]/gems/activemodel-3.0.1/lib/active_model/serializers/xml.rb:103:in `serialize' 
    from /home/kai/.rvm/gems/[email protected]/gems/builder-2.1.2/lib/builder/xmlbase.rb:134:in `call' 
    from /home/kai/.rvm/gems/[email protected]/gems/builder-2.1.2/lib/builder/xmlbase.rb:134:in `_nested_structures' 
    from /home/kai/.rvm/gems/[email protected]/gems/builder-2.1.2/lib/builder/xmlbase.rb:58:in `method_missing' 
    from /home/kai/.rvm/gems/[email protected]/gems/builder-2.1.2/lib/builder/xmlbase.rb:31:in `tag!' 
    from /home/kai/.rvm/gems/[email protected]/gems/activemodel-3.0.1/lib/active_model/serializers/xml.rb:101:in `serialize' 
    from /home/kai/.rvm/gems/[email protected]/gems/activerecord-3.0.1/lib/active_record/serializers/xml_serializer.rb:175:in `to_xml' 
    from /home/kai/.rvm/gems/[email protected]/gems/activerecord-3.0.1/lib/active_record/associations/association_proxy.rb:218:in `send' 
    from /home/kai/.rvm/gems/[email protected]/gems/activerecord-3.0.1/lib/active_record/associations/association_proxy.rb:218:in `method_missing' 
... 5 levels... 
    from /home/kai/.rvm/gems/[email protected]/gems/builder-2.1.2/lib/builder/xmlbase.rb:134:in `call' 
    from /home/kai/.rvm/gems/[email protected]/gems/builder-2.1.2/lib/builder/xmlbase.rb:134:in `_nested_structures' 
    from /home/kai/.rvm/gems/[email protected]/gems/builder-2.1.2/lib/builder/xmlbase.rb:58:in `method_missing' 
    from /home/kai/.rvm/gems/[email protected]/gems/builder-2.1.2/lib/builder/xmlbase.rb:31:in `tag!' 
    from /home/kai/.rvm/gems/[email protected]/gems/activemodel-3.0.1/lib/active_model/serializers/xml.rb:101:in `serialize' 
    from /home/kai/.rvm/gems/[email protected]/gems/activerecord-3.0.1/lib/active_record/serializers/xml_serializer.rb:175:in `to_xml' 
    from /home/kai/.rvm/gems/[email protected]/gems/activesupport-3.0.1/lib/active_support/xml_mini.rb:107:in `to_tag' 
    from /home/kai/.rvm/gems/[email protected]/gems/activesupport-3.0.1/lib/active_support/core_ext/array/conversions.rb:159:in `to_xml' 
    from /home/kai/.rvm/gems/[email protected]/gems/activesupport-3.0.1/lib/active_support/core_ext/array/conversions.rb:159:in `each' 
    from /home/kai/.rvm/gems/[email protected]/gems/activesupport-3.0.1/lib/active_support/core_ext/array/conversions.rb:159:in `to_xml' 
    from /home/kai/.rvm/gems/[email protected]/gems/builder-2.1.2/lib/builder/xmlbase.rb:134:in `call' 
    from /home/kai/.rvm/gems/[email protected]/gems/builder-2.1.2/lib/builder/xmlbase.rb:134:in `_nested_structures' 
    from /home/kai/.rvm/gems/[email protected]/gems/builder-2.1.2/lib/builder/xmlbase.rb:58:in `method_missing' 
    from /home/kai/.rvm/gems/[email protected]/gems/activesupport-3.0.1/lib/active_support/core_ext/array/conversions.rb:158:in `__send__' 
    from /home/kai/.rvm/gems/[email protected]/gems/activesupport-3.0.1/lib/active_support/core_ext/array/conversions.rb:158:in `to_xml' 

Update ve çözüm

HoBlend haklıydı ... Varlık modelinde derneklerin biri değildi doğru ayarlanmış, ancak properties bir tane. ,
Eğer ActiveRecord dernekler ile çalışmaya kullanılırsa belongs_to :created_by, :class_name => "User", :foreign_key => "created_by"
Eğer :foreign_key parametre burada geçerli olmadığını bakın (Bu dernek diğer tarafta olmalıdır:
varlıkta da kullanıcı modeli için bağ olabileceğini Ayrıca nerede idi). Raylar bu parametre hakkında asla şikayet etmedi ve testlerim geçti. Ancak XML serileştirme bir şekilde başarısız oldu (şaşırtıcı bir şekilde JSON serileştirmesi değil). güncelleme

ait

Güncelleme Bir böcek ActiveRecord yerde var gibi görünüyor. Aşağıdaki modeller düşünün:

class User < ActiveRecord::Base 
    has_many :created_entities, :class_name => "Entity", :foreign_key => "created_by" 
end 

class Entity < ActiveRecord::Base 
    belongs_to :created_by, :class_name => "User", :foreign_key => "created_by" 
end 

A created_by tamsayı alanı Varlık göç mevcuttur. Görünüşe göre, ait_dosyası ile aynı ismi girin: foreign_key, sonra XML serileştirme bozulur. belongs_to :creator, :class_name => "User", :foreign_key => "created_by" olarak değiştirdiğimde seri hale getirme beklendiği gibi çalışır.

Bu zaten Raylar 3.0.3 çözülmüştür

güncelleme ;-) ait güncelleme Güncelleme (ve 3.0.1 vardı). Öyleyse ne öğreniyorum ... yazılımı ilk olarak güncelle!

cevap

1

Büyük olasılıkla model ilişkileri düzgün ayarlanmamış. yapmanız yapabiliyor musunuz:

 
e = Entity.find.first 
e.properties 

ve ilişkili nesneleri döndürmek var?

+0

Evet, öyle. Daha önce de belirttiğim gibi, aynı veritabanında aynı komut kullanılır, ancak sadece to_json ile çalışır (tüm özellikler doğru şekilde json'a serileştirilir). – Zardoz

+0

Çözüldü (yukarıdaki düzenlemeye bakın) ... ve sizin için bazı puanlar :-) – Zardoz

İlgili konular