2010-11-18 2 views
0

Я пытаюсь извлечь некоторые объекты модели из базы данных и сериализовать их в 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). Итак, что я узнаю ... сначала обновите программное обеспечение!

ответ

1

Скорее всего, отношения модели не настроены должным образом. Вы в состоянии сделать:

 
e = Entity.find.first 
e.properties 

и его возвращают связанные объекты?

+0

Да, это так. Как я уже упоминал, одна и та же команда в одном и том же состоянии базы данных, но только с to_json работает отлично (все свойства корректно сериализованы для json). – Zardoz

+0

Решено (см. Выше) редактировать) ... и некоторые оценки для вас :-) – Zardoz

Смежные вопросы