私が試みるのは、データベースからいくつかのモデルオブジェクトをフェッチして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を持っていました)。だから私は何を学ぶのですか?最初にソフトウェアを更新してください!
はい、あります。前述したように、同じデータベース状態の同じコマンドが、to_jsonだけで正常に動作します(すべてのプロパティがjsonに正しくシリアル化されています)。 – Zardoz
解決済み(上の編集を参照)...そしてあなたのためのいくつかのスコア:-) – Zardoz