Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I use savon nested attributes! hash?

Tags:

soap

ruby

savon

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>
like image 631
Sameer C Avatar asked Dec 09 '10 03:12

Sameer C


2 Answers

I ran across the issue of the previous answer no longer working. Eventually I found https://github.com/savonrb/savon/issues/518 which lead me to the correct syntax to add attributes now.

So the previous example would now be done as

{ 
  :person => {
    :@id => 666,
    :address => {
      :@id => 44
    }
  }
}

Which would generate the following xml

<person id="666">
  <address id="44"/>
</person>
like image 94
DuckNG Avatar answered Nov 14 '22 20:11

DuckNG


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>"
like image 36
trptcolin Avatar answered Nov 14 '22 20:11

trptcolin