Rendre une ERB modèle avec des valeurs de hachage
Je dois être oublié quelque chose de très simple ici, mais je n'arrive pas à comprendre comment rendre une simple ERB modèle avec des valeurs de hachage-carte.
Je suis relativement nouveau à ruby, venant de python. J'ai une ERB modèle (pas en HTML), dont j'ai besoin rendus avec le contexte à partir d'un hash-carte, que je reçois à partir d'une source externe.
Toutefois, la documentation de ERB, les états qui la ERB.result
méthode prend un binding
. J'ai appris qu'ils sont quelque chose que tenir la variable contextes en ruby (quelque chose comme locals()
et globals()
en python, je suppose?). Mais, je ne sais pas comment je peux construire un objet de liaison de mon hash-carte.
Un peu (un beaucoup, en fait) une recherche sur google m'a donné ceci: http://refactormycode.com/codes/281-given-a-hash-of-variables-render-an-erb-template, qui utilise ruby métaprogrammation magie qui m'échappe.
Donc, n'est-ce pas là une solution simple à ce problème? Ou est-il un meilleur moteur de template (non liées à HTML) mieux adapté pour cela? (J'ai seulement choisi ERB parce que ses dans la stdlib).
- Je ne sais pas du tout Ruby moteurs de template qui sont "attachés" au format HTML; un modèle est un modèle. Aussi ne savez pas quel est le problème avec la solution que vous liez-est de la question de l'obtention de la valeur de hachage dans le module?
- Dave, Rien de mal à cela tant que tel. Juste que je pensais qu'il pouvait être une solution plus élégante pour un problème simple que d'aller à la mesure de l'utilisation de la métaprogrammation.
- cette? stackoverflow.com/questions/1338960/...
- Exemple: gist.github.com/bastman/55f1c5a5bb474e472d5e
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas si cela est admissible à titre de "plus élégant" ou pas:
Ou à partir d'une méthode de classe:
(ErbalT a Erb, T pour le modèle, et des sons comme "thé à base de plantes". En nommant des choses est difficile.)
OpenStruct
. Je vais arriver à la docs, pas de problème 🙂e.g
OpenStruct
est instancié. Cela donne le modèle de l'accès à beaucoup plus que prévu, et pourrait conduire à des insectes ou même une faille de sécurité, par exemple gist.github.com/aspiers/ad6549058ee423819976Si vous pouvez utiliser Erubis vous avez cette fonctionnalité déjà:
Ruby 2.5 a
ERB#result_with_hash
qui fournit cette fonctionnalité:La partie la plus délicate ici est de ne pas polluer la liaison de la redondance des variables locales (comme dans top-rated réponses):
ERB.new("Hi <%= name %>").result_with_hash(name: "Tom")
Solution Simple à l'aide de La liaison:
Si vous voulez faire les choses très simplement, vous pouvez toujours utiliser explicite de hachage des recherches à l'intérieur de l'ERB modèle. Dire que vous utilisez "contraignant" pour passer d'un hachage variable appelée "hash" dans le modèle, il devrait ressembler à ceci:
binding
pour passer le hachage variable?ERB.new(template).result(binding)
.Kernel#binding
permettra de saisir toutes les variables qui sont dans la portée, et ils seront disponibles à l'intérieur de l'ERB modèle.instance_eval
de réponse souffre?binding
. Depuis ERB modèles peuvent contenir arbitraire de code Ruby, vous avez à regarder le bac à sable de l'ensemble du processus qui rend les modèles. (...ce qui est clairement hors de portée de la question posée ici.)