Как использовать вложенные атрибуты savon! хэш? - PullRequest
6 голосов
/ 09 декабря 2010

Я смотрю на использование Ruby Savon для SOAP. По чисто мазохистским причинам мне приходится иметь дело с элементами SOAP, имеющими атрибуты.

Итак, нет проблем, на сайте savon docs есть пример, который подчеркивает эту способность:

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

Моя проблема заключается в том, как установить атрибуты для дочерних элементов, например, скажем, я добавляю дочерний элемент адреса для человека:

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

Теперь я хочу добавить атрибут id к элементу адреса:

Это не пойдет, если я вложу адрес в хэш атрибутов:

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

Итак, мой вопрос, как я могу получить это?

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

Ответы [ 2 ]

16 голосов
/ 11 февраля 2015

Я наткнулся на вопрос предыдущего ответа, больше не работает. В конце концов я нашел https://github.com/savonrb/savon/issues/518, что привело меня к правильному синтаксису для добавления атрибутов.

Так что предыдущий пример теперь будет выглядеть как

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

Что бы сгенерировать следующий xml

<person id="666">
  <address id="44"/>
</person>
14 голосов
/ 09 декабря 2010

Вы были близки - просто нужно было поместить ключ :attributes! в тот же хеш, который содержит значение.

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

# => "<person id=\"666\"><address id=\"44\"></address></person>"
...