Я пытаюсь извлечь некоторые объекты модели из базы данных и сериализовать их в xml, но при включении конкретной ассоциации (has_many) я получаю ошибку ниже.Сериализация JSON (to_json) работает без проблем (с включенными свойствами).Также сериализация одного объекта (XML и JSON).В чем может быть проблема?(Класс модели не переопределяет какие-либо вещи XML-сериализации, я использую Rails 3).
Здесь команда:
Entity.all.to_xml :include => :properties
и дамп:
NoMethodError: undefined method `macro' for nil:NilClass
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activesupport-3.0.1/lib/active_support/whiny_nil.rb:48:in `method_missing'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activerecord-3.0.1/lib/active_record/serialization.rb:41:in `serializable_add_includes'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activerecord-3.0.1/lib/active_record/serialization.rb:40:in `each'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activerecord-3.0.1/lib/active_record/serialization.rb:40:in `serializable_add_includes'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activerecord-3.0.1/lib/active_record/serializers/xml_serializer.rb:191:in `send'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activerecord-3.0.1/lib/active_record/serializers/xml_serializer.rb:191:in `add_includes'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activerecord-3.0.1/lib/active_record/serializers/xml_serializer.rb:186:in `add_extra_behavior'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activemodel-3.0.1/lib/active_model/serializers/xml.rb:103:in `serialize'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/builder-2.1.2/lib/builder/xmlbase.rb:134:in `call'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/builder-2.1.2/lib/builder/xmlbase.rb:134:in `_nested_structures'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/builder-2.1.2/lib/builder/xmlbase.rb:58:in `method_missing'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/builder-2.1.2/lib/builder/xmlbase.rb:31:in `tag!'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activemodel-3.0.1/lib/active_model/serializers/xml.rb:101:in `serialize'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activerecord-3.0.1/lib/active_record/serializers/xml_serializer.rb:175:in `to_xml'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activerecord-3.0.1/lib/active_record/associations/association_proxy.rb:218:in `send'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activerecord-3.0.1/lib/active_record/associations/association_proxy.rb:218:in `method_missing'
... 5 levels...
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/builder-2.1.2/lib/builder/xmlbase.rb:134:in `call'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/builder-2.1.2/lib/builder/xmlbase.rb:134:in `_nested_structures'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/builder-2.1.2/lib/builder/xmlbase.rb:58:in `method_missing'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/builder-2.1.2/lib/builder/xmlbase.rb:31:in `tag!'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activemodel-3.0.1/lib/active_model/serializers/xml.rb:101:in `serialize'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activerecord-3.0.1/lib/active_record/serializers/xml_serializer.rb:175:in `to_xml'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activesupport-3.0.1/lib/active_support/xml_mini.rb:107:in `to_tag'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activesupport-3.0.1/lib/active_support/core_ext/array/conversions.rb:159:in `to_xml'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activesupport-3.0.1/lib/active_support/core_ext/array/conversions.rb:159:in `each'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activesupport-3.0.1/lib/active_support/core_ext/array/conversions.rb:159:in `to_xml'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/builder-2.1.2/lib/builder/xmlbase.rb:134:in `call'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/builder-2.1.2/lib/builder/xmlbase.rb:134:in `_nested_structures'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/builder-2.1.2/lib/builder/xmlbase.rb:58:in `method_missing'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activesupport-3.0.1/lib/active_support/core_ext/array/conversions.rb:158:in `__send__'
from /home/kai/.rvm/gems/ruby-1.8.7-p302@projectx/gems/activesupport-3.0.1/lib/active_support/core_ext/array/conversions.rb:158:in `to_xml'
Обновление и решение
HoBlend был прав ... одна из ассоциаций в модели Entity была настроена неправильно, но не properties
one.
В сущности былотакже связь с моделью User:
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
присутствует в миграции сущности.Кажется, что когда вы называете принадлежную принадлежность принадлежащим вам так же, как: foreign_key, сериализация XML прерывается.Как только я перешел на belongs_to :creator, :class_name => "User", :foreign_key => "created_by"
, сериализация работает, как и ожидалось.
Обновление обновления обновления; -)
Это уже решено в Rails 3.0.3 (и у меня было3.0.1).Итак, что я узнаю ... сначала обновите программное обеспечение!