2010-11-18 42 views
0

我试图从数据库中获取一些模型对象并将它们序列化为xml,但是当包含特定的(has_many)关联时,我得到下面的错误。 JSON序列化(to_json)没有问题(包含属性)。也是一个对象的序列化(XML和JSON)。问题是什么? (模型类不重写任何XML序列化的东西,我使用的是Rails 3)。序列化to_xml时NoMethodError

这里的命令:
Entity.all.to_xml :include => :properties

和转储:

 
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/ruby-1.8[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' 

更新和解决方案

HoBlend是对的。在实体模型的关联的一个不设置正确,但不是properties之一。
在实体也有关联到用户模式:
belongs_to :created_by, :class_name => "User", :foreign_key => "created_by"
如果你习惯用ActiveRecord关联的工作,你看到:foreign_key参数在这里可能无效(必须是在关联的另一边,它也在那里)。 Rails从来没有抱怨过这个参数,我的测试都通过了。但它使XML序列化以某种方式失败(令人惊讶的不是JSON序列化)。

更新更新

看来ActiveRecord中存在一个错误。请考虑以下型号:

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整数字段存在于实体迁移中。看起来,如果您将belongs_to关联命名为:foreign_key,那么XML序列化会中断。只要我更改为belongs_to :creator, :class_name => "User", :foreign_key => "created_by",序列化就会按预期工作。

这在Rails的3.0.3已经解决了更新;-)的更新的更新(我有3.0.1)。那么我该如何学习......先更新软件!

回答

1

最有可能的模型关系不正确。 您能做到:

 
e = Entity.find.first 
e.properties 

并让它返回关联的对象?

+0

是的,它的确如此。正如我所提到的,在同一个数据库状态下的相同命令,但只要to_json工作正常(所有属性都被正确序列化为json)。 – Zardoz 2010-11-18 20:22:40

+0

解决了(请参阅上面的编辑)...和一些分数为你:-) – Zardoz 2010-11-19 23:06:49