How do I use savon nested attributes! hash?

ruby, savon, soap

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>"

Problem

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> ```

Original source