diff options
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/CHANGELOG | 2 | ||||
-rwxr-xr-x | activerecord/lib/active_record/base.rb | 16 | ||||
-rwxr-xr-x | activerecord/test/base_test.rb | 6 | ||||
-rwxr-xr-x | activerecord/test/fixtures/company.rb | 4 |
4 files changed, 28 insertions, 0 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index 7583b72a45..bd595c177b 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Allow AR::Base#to_xml to include methods too. Closes #4921. [johan@textdrive.com] + * Replace superfluous name_to_class_name variant with camelize. [Marcel Molina Jr.] * Replace alias method chaining with Module#alias_method_chain. [Marcel Molina Jr.] diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index e7fa8434e6..511af69428 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -1690,6 +1690,16 @@ module ActiveRecord #:nodoc: # <credit-limit type="integer">50</credit-limit> # </account> # </firm> + # + # To include any methods on the object(s) being called use :methods + # + # firm.to_xml :methods => [ :calculated_earnings, :real_earnings ] + # + # <firm> + # # ... normal attributes as shown above ... + # <calculated-earnings>100000000000000000</calculated-earnings> + # <real-earnings>5</real-earnings> + # </firm> def to_xml(options = {}) options[:root] ||= self.class.to_s.underscore options[:except] = Array(options[:except]) << self.class.inheritance_column unless options[:only] # skip type column @@ -1697,6 +1707,12 @@ module ActiveRecord #:nodoc: attributes_for_xml = attributes(root_only_or_except) + if methods_to_call = options.delete(:methods) + [*methods_to_call].each do |meth| + attributes_for_xml[meth] = send(meth) + end + end + if include_associations = options.delete(:include) include_has_options = include_associations.is_a?(Hash) diff --git a/activerecord/test/base_test.rb b/activerecord/test/base_test.rb index 2f834772a6..4ccc2c8588 100755 --- a/activerecord/test/base_test.rb +++ b/activerecord/test/base_test.rb @@ -1273,6 +1273,12 @@ class BasicsTest < Test::Unit::TestCase assert xml.include?(%(<clients><client>)) end + def test_to_xml_including_methods + xml = Company.new.to_xml(:methods => :arbitrary_method, :skip_instruct => true) + assert_equal "<company>", xml.first(9) + assert xml.include?(%(<arbitrary-method>I am Jack's profound disappointment</arbitrary-method>)) + end + def test_except_attributes assert_equal( %w( author_name type id approved replies_count bonus_time written_on content author_email_address parent_id last_read), diff --git a/activerecord/test/fixtures/company.rb b/activerecord/test/fixtures/company.rb index 526748784e..250deebb21 100755 --- a/activerecord/test/fixtures/company.rb +++ b/activerecord/test/fixtures/company.rb @@ -5,6 +5,10 @@ class Company < ActiveRecord::Base validates_presence_of :name has_one :dummy_account, :foreign_key => "firm_id", :class_name => "Account" + + def arbitrary_method + "I am Jack's profound disappointment" + end end |