Module ActiveSupport::CoreExtensions::Hash::Conversions
In: vendor/rails/activesupport/lib/active_support/core_ext/hash/conversions.rb

Methods

included   to_xml  

Classes and Modules

Module ActiveSupport::CoreExtensions::Hash::Conversions::ClassMethods

Constants

XML_TYPE_NAMES = { "Fixnum" => "integer", "Bignum" => "integer", "BigDecimal" => "numeric", "Float" => "float", "Date" => "date", "DateTime" => "datetime", "Time" => "datetime", "TrueClass" => "boolean", "FalseClass" => "boolean"
XML_FORMATTING = { "date" => Proc.new { |date| date.to_s(:db) }, "datetime" => Proc.new { |time| time.xmlschema }, "binary" => Proc.new { |binary| Base64.encode64(binary) }

Public Class methods

[Source]

    # File vendor/rails/activesupport/lib/active_support/core_ext/hash/conversions.rb, line 47
47:         def self.included(klass)
48:           klass.extend(ClassMethods)
49:         end

Public Instance methods

[Source]

     # File vendor/rails/activesupport/lib/active_support/core_ext/hash/conversions.rb, line 51
 51:         def to_xml(options = {})
 52:           options[:indent] ||= 2
 53:           options.reverse_merge!({ :builder => Builder::XmlMarkup.new(:indent => options[:indent]),
 54:                                    :root => "hash" })
 55:           options[:builder].instruct! unless options.delete(:skip_instruct)
 56:           dasherize = !options.has_key?(:dasherize) || options[:dasherize]
 57:           root = dasherize ? options[:root].to_s.dasherize : options[:root].to_s
 58: 
 59:           options[:builder].__send__(:method_missing, root) do
 60:             each do |key, value|
 61:               case value
 62:                 when ::Hash
 63:                   value.to_xml(options.merge({ :root => key, :skip_instruct => true }))
 64:                 when ::Array
 65:                   value.to_xml(options.merge({ :root => key, :children => key.to_s.singularize, :skip_instruct => true}))
 66:                 when ::Method, ::Proc
 67:                   # If the Method or Proc takes two arguments, then
 68:                   # pass the suggested child element name.  This is
 69:                   # used if the Method or Proc will be operating over
 70:                   # multiple records and needs to create an containing
 71:                   # element that will contain the objects being
 72:                   # serialized.
 73:                   if 1 == value.arity
 74:                     value.call(options.merge({ :root => key, :skip_instruct => true }))
 75:                   else
 76:                     value.call(options.merge({ :root => key, :skip_instruct => true }), key.to_s.singularize)
 77:                   end
 78:                 else
 79:                   if value.respond_to?(:to_xml)
 80:                     value.to_xml(options.merge({ :root => key, :skip_instruct => true }))
 81:                   else
 82:                     type_name = XML_TYPE_NAMES[value.class.name]
 83: 
 84:                     key = dasherize ? key.to_s.dasherize : key.to_s
 85: 
 86:                     attributes = options[:skip_types] || value.nil? || type_name.nil? ? { } : { :type => type_name }
 87:                     if value.nil?
 88:                       attributes[:nil] = true
 89:                     end
 90: 
 91:                     options[:builder].tag!(key,
 92:                       XML_FORMATTING[type_name] ? XML_FORMATTING[type_name].call(value) : value,
 93:                       attributes
 94:                     )
 95:                 end
 96:               end
 97:             end
 98:           end
 99: 
100:         end

[Validate]