Я пытаюсь извлечь некоторые объекты модели из базы данных и сериализовать их в xml, но при включении конкретной (has_many) ассоциации я получаю следующую ошибку. Сериализация JSON (to_json) работает без проблем (с включенными свойствами). Также сериализация одного объекта (XML и JSON). В чем проблема? (Класс модели не переопределяет какие-либо операции сериализации XML, я использую Rails 3).NoMethodError при сериализации to_xml
Здесь команда:
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/[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 и решение
HoBlend был прав ... одна из ассоциаций в модели Entity не были правильно настройте, но не 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
created_by
целое поле присутствует в миграции Entity. Кажется, когда вы называете ассоциацию 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
Решено (см. Выше) редактировать) ... и некоторые оценки для вас :-) – Zardoz