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", ::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 24
24:         def self.included(klass)
25:           klass.extend(ClassMethods)
26:         end

Public Instance methods

[Source]

    # File vendor/rails/activesupport/lib/active_support/core_ext/hash/conversions.rb, line 28
28:         def to_xml(options = {})
29:           options[:indent] ||= 2
30:           options.reverse_merge!({ :builder => Builder::XmlMarkup.new(:indent => options[:indent]),
31:                                    :root => "hash" })
32:           options[:builder].instruct! unless options.delete(:skip_instruct)
33:           dasherize = !options.has_key?(:dasherize) || options[:dasherize]
34:           root = dasherize ? options[:root].to_s.dasherize : options[:root].to_s
35: 
36:           options[:builder].__send__(root) do
37:             each do |key, value|
38:               case value
39:                 when ::Hash
40:                   value.to_xml(options.merge({ :root => key, :skip_instruct => true }))
41:                 when ::Array
42:                   value.to_xml(options.merge({ :root => key, :children => key.to_s.singularize, :skip_instruct => true}))
43:                 when ::Method, ::Proc
44:                   # If the Method or Proc takes two arguments, then
45:                   # pass the suggested child element name.  This is
46:                   # used if the Method or Proc will be operating over
47:                   # multiple records and needs to create an containing
48:                   # element that will contain the objects being
49:                   # serialized.
50:                   if 1 == value.arity
51:                     value.call(options.merge({ :root => key, :skip_instruct => true }))
52:                   else
53:                     value.call(options.merge({ :root => key, :skip_instruct => true }), key.to_s.singularize)
54:                   end
55:                 else
56:                   if value.respond_to?(:to_xml)
57:                     value.to_xml(options.merge({ :root => key, :skip_instruct => true }))
58:                   else
59:                     type_name = XML_TYPE_NAMES[value.class]
60: 
61:                     key = dasherize ? key.to_s.dasherize : key.to_s
62: 
63:                     attributes = options[:skip_types] || value.nil? || type_name.nil? ? { } : { :type => type_name }
64:                     if value.nil?
65:                       attributes[:nil] = true
66:                     end
67: 
68:                     options[:builder].tag!(key,
69:                       XML_FORMATTING[type_name] ? XML_FORMATTING[type_name].call(value) : value,
70:                       attributes
71:                     )
72:                 end
73:               end
74:             end
75:           end
76: 
77:         end

[Validate]