Генерация тегов на лету для XML Builders - PullRequest
1 голос
/ 03 марта 2010

У меня есть хэш, как,

object = { :type => 'book', :name => 'RoR', :price => 33 }

OR

object = { :type => 'wig', :name => 'Elvis-Style', :price => 40, :color => 'black' }

Проблема в том, что ключи в приведенном выше хеше могут все время отличаться или даже увеличиваться и уменьшаться в зависимости от типа объекта.

Что я хочу сделать, чтобы сгенерировать XML для вышеуказанных хэшей, используя Xml::Builder. Теги XML определяются keys в хэше, а text внутри тега является значением, соответствующим этому ключу.

Я могу использовать eval, чтобы сделать это, как показано ниже. Однако я думаю, что должен быть лучший способ сделать это.

object.each do |key, text|
  eval("xml.#{key.to_s} do
          #{text}
        end
      ")
end

Ответы [ 4 ]

2 голосов
/ 03 марта 2010
@object.each do |k, v|
  xml.tag!(k.to_s, v)
end
1 голос
/ 03 марта 2010

Rails поддерживает to_xml в классах Hash.

hash = { :type => 'book', :name => 'RoR', :price => 33 }
hash.to_xml
# Returns
# <?xml version=\"1.0\" encoding=\"UTF-8\"?>
# <hash>
#   <type>book</type>
#   <name>RoR</name>
#   <price type=\"integer\">33</price>
# </hash>

Если вы хотите пропустить типы, то:

hash.to_xml(:skip_types => true)

Если вы хотите задать другой корень, тогда:

hash.to_xml(:root => 'options')
1 голос
/ 03 марта 2010

Этот работал.

@object.each do |k, v|
  xml.tag!(k.to_s, v)
end
0 голосов
/ 03 марта 2010
   out << "<#{key}>#{html_escape(value)}</#{key}>"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...