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

Included in:
Hash
Defined in:
lib/active_support/core_ext/hash/conversions.rb

Constant Summary collapse

XML_TYPE_NAMES =
{
  "Fixnum"     => "integer",
  "Date"       => "date",
  "Time"       => "datetime",
  "TrueClass"  => "boolean",
  "FalseClass" => "boolean"
}
XML_FORMATTING =
{
  "date"     => Proc.new { |date| date.to_s(:db) },
  "datetime" => Proc.new { |time| time.xmlschema }
}

Instance Method Summary collapse

Instance Method Details

#to_xml(options = {}) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/active_support/core_ext/hash/conversions.rb', line 18

def to_xml(options = {})
  options[:indent] ||= 2
  options.reverse_merge!({ :builder => Builder::XmlMarkup.new(:indent => options[:indent]), :root => "hash" })
  options[:builder].instruct! unless options.delete(:skip_instruct)

  options[:builder].__send__(options[:root].to_s.dasherize) do
    each do |key, value|
      case value
        when ::Hash
          value.to_xml(options.merge({ :root => key, :skip_instruct => true }))
        when ::Array
          value.to_xml(options.merge({ :root => key, :children => key.to_s.singularize, :skip_instruct => true}))
        else
          type_name = XML_TYPE_NAMES[value.class.to_s]

          options[:builder].tag!(key.to_s.dasherize, 
            XML_FORMATTING[type_name] ? XML_FORMATTING[type_name].call(value) : value,
            options[:skip_types] || value.nil? || type_name.nil? ? { } : { :type => type_name }
          )
      end
    end
  end
end