diff --git a/activemodel/CHANGELOG.md b/activemodel/CHANGELOG.md index 5135e47db1af0a92f1caa9be4eb35eb677b6c701..dc39917984cc52b1a91e31a360896433391f9200 100644 --- a/activemodel/CHANGELOG.md +++ b/activemodel/CHANGELOG.md @@ -1,5 +1,7 @@ ## Rails 4.0.0 (unreleased) ## +* Specify type of singular association during serialization *Steve Klabnik* + * Fixed length validator to correctly handle nil values. Fixes #7180. *Michal Zima* diff --git a/activemodel/lib/active_model/serializers/xml.rb b/activemodel/lib/active_model/serializers/xml.rb index fb6093cce5a4e835a1f0a6dd529166840c9574a1..4a17a63e208aa71ad355e3ea5cf016b30162a0a1 100755 --- a/activemodel/lib/active_model/serializers/xml.rb +++ b/activemodel/lib/active_model/serializers/xml.rb @@ -149,7 +149,12 @@ def add_associations(association, records, opts) end else merged_options[:root] = association.to_s - records.to_xml(merged_options) + + unless records.class.to_s.underscore == association.to_s + merged_options[:type] = records.class.name + end + + records.to_xml merged_options end end diff --git a/activemodel/test/cases/serializers/xml_serialization_test.rb b/activemodel/test/cases/serializers/xml_serialization_test.rb index 90ddf8ff0cc5933a6e389a06531b8d5f16474347..99a9c1fe33a3c44687c7ebf833d0c84d8786278c 100755 --- a/activemodel/test/cases/serializers/xml_serialization_test.rb +++ b/activemodel/test/cases/serializers/xml_serialization_test.rb @@ -6,12 +6,12 @@ class Contact include ActiveModel::Serializers::Xml - attr_accessor :address, :friends + attr_accessor :address, :friends, :contact remove_method :attributes if method_defined?(:attributes) def attributes - instance_values.except("address", "friends") + instance_values.except("address", "friends", "contact") end end @@ -56,6 +56,9 @@ def setup @contact.address.zip = 11111 @contact.address.apt_number = 35 @contact.friends = [Contact.new, Contact.new] + @related_contact = SerializableContact.new + @related_contact.name = "related" + @contact.contact = @related_contact end test "should serialize default root" do @@ -256,4 +259,9 @@ def to_ary assert_match %r{
}, xml assert_match %r{}, xml end + + test "association with sti" do + xml = @contact.to_xml(include: :contact) + assert xml.include?(%()) + end end