2010-11-18 6 views
0

私が試みるのは、データベースからいくつかのモデルオブジェクトをフェッチしてxmlにシリアライズすることですが、特定の(has_many)関連を含めると、以下のエラーが発生します。 JSONシリアライゼーション(to_json)は問題なく動作します(プロパティも含まれています)。また、1つのオブジェクト(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/[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は正しかった...エンティティモデルの団体の一つではありませんでした正しく設定されていますが、propertiesはありません。
はエンティティでアソシエーションは、Userモデルにもありました:あなたは、あなたが:foreign_keyパラメータは、ここで有効ではないことがわかりActiveRecordの団体と協力して使用している場合
belongs_to :created_by, :class_name => "User", :foreign_key => "created_by"
それは協会の反対側にある必要があります(、どこにあったか)。 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整数フィールドは、エンティティの移行中に存在しています。 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