2010-04-22 9 views
1

Maintenant, je sais comment compiler XML sans échapper les valeurs. How to tell Builder to not to escape valuesComment construire un générateur dynamiquement avec des valeurs d'échappement

Cependant, j'ai besoin de construire des balises dynamiquement.

Résultat souhaité

<bank_info>Chase</bank_info> 

Ce que j'est

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

je peux essayer de faire la chose comme une chaîne géante et qui eval. Mais évaluer n'est pas si sûr. Y a-t-il une meilleure option qui me manque?

Répondre

5

En général, le moyen le plus simple d'appeler une méthode pour laquelle vous avez un nom est d'utiliser send ou __send__. Ici:

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

BTW, il y a la variante public_send, si vous voulez vous assurer n'êtes pas appeler une méthode privée. C'est seulement dans Ruby 1.9, vous pouvez require "backports" pour l'utiliser dans Ruby 1.8.

Remarque: dans ce cas, send ne fonctionne pas, comme indiqué par @KandadaBoggu, car Builder le remplace; vous devez utiliser __send__.

+0

@marc Votre code générera '' bank_infoChase comme balisage. Il semble que le constructeur remplace toutes les méthodes par défaut. J'ai travaillé autour d'elle en utilisant la méthode 'tag!' –

+0

Cela devrait m'apprendre à ne pas tester mon code! Je me demande si '__send__' est aussi redéfini ... Quoi qu'il en soit,' tag! 'Est le chemin à parcourir –

+0

désolé je devrais avoir mentionné que je veux que mes données soient non échappées et tag! échappe. C'est pourquoi dans mon exemple j'ai recouru à <<. –

4

Essayez ceci:

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

désolé je devrais avoir mentionné que je veux que mes données soient dégagées et tag! échappe. C'est pourquoi dans mon exemple j'ai recouru à <<. –