Search code examples
rubysoapsavon

How do I use savon nested attributes! hash?


I'm looking at using Ruby savon for SOAP. For purely masochistic reasons I have to deal with SOAP elements having attributes.

So, no problem, there is an example on the savon docs site which highlights this ability:

{ :person => "Eve", :attributes! => { :person => { :id => 666 } } }.to_soap_xml
"<person id=\"666\">Eve</person>"

My problem is how do I set attributes on child elements, for example, say I add an address child element to person:

{ :person => {:address => ""}, :attributes! => { :person => { :id => 666 } } }.to_soap_xml

Now I want to add an id attribute to the address element:

It's no go if I nest address in the attributes hash:

{ :person => {:address => ""}, :attributes! => { :person => { :id => 666, :address => {:id => 44 }} }}.to_soap_xml

So my question is, how can I get this?

<person id=666><address id=44></address></person>

Solution

  • You were close - just needed to put the :attributes! key in the same hash that contains the value.

    {
      :person => {
        :address => "", 
        :attributes! => { :address => { :id => 44 } }
      }, 
      :attributes! => { :person => { :id => 666 } } 
    }.to_soap_xml
    
    # => "<person id=\"666\"><address id=\"44\"></address></person>"