我试图从数据库中获取一些模型对象并将它们序列化为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)。那么我该如何学习......先更新软件!
是的,它的确如此。正如我所提到的,在同一个数据库状态下的相同命令,但只要to_json工作正常(所有属性都被正确序列化为json)。 – Zardoz 2010-11-18 20:22:40
解决了(请参阅上面的编辑)...和一些分数为你:-) – Zardoz 2010-11-19 23:06:49