Как построить построитель динамически с экранированными значениями - PullRequest
1 голос
/ 22 апреля 2010

Теперь я знаю, как создать XML без экранирования значений. Как сказать Билдеру, чтобы они не экранировали значения

Однако мне нужно создавать теги динамически.

Желаемый результат

<bank_info>Chase</bank_info>

Что у меня есть

attr = 'bank_info'
builder = Builder::XmlMarkup.new
builder.attr { |x| x << 'bank_info' } # does not work

Я могу попробовать сделать все это как гигантскую нить и оценить это. Но оценивать не так безопасно. Есть ли лучший вариант, который мне не хватает.

Ответы [ 2 ]

5 голосов
/ 22 апреля 2010

В общем, самый простой способ вызвать метод, для которого у вас есть имя, это использовать send или __send__.Здесь:

builder = Builder::XmlMarkup.new
builder.__send__("bank_info") do  # same effect as:  builder.bank_info do
  builder << "Chase"
end

Кстати, есть вариант public_send, если вы хотите убедиться, что вы не вызываете закрытый метод.Это только в Ruby 1.9, вы можете require "backports" использовать его в Ruby 1.8.

Примечание: в этом случае send не работает, как указано @KandadaBoggu, потому что Builder переопределяет его;Вы должны использовать __send__.

4 голосов
/ 22 апреля 2010

Попробуйте это:

 builder.tag! "bank_info", "Citi"
...