74 votes

Rendu d'un modèle ERB avec les valeurs d'un hachage

Je dois négliger quelque chose de très simple, mais je n'arrive pas à trouver comment rendre un modèle ERB simple avec les valeurs d'une carte de hachage.

Je suis relativement novice en ruby, venant de python. J'ai un modèle ERB (pas HTML), qui doit être rendu avec le contexte qui doit être pris à partir d'une carte de hachage, que je reçois d'une source externe.

Cependant, la documentation de l'ERB, indique que la ERB.result La méthode prend un binding . J'ai appris qu'ils sont quelque chose qui contient les contextes de variables dans ruby (quelque chose comme locals() y globals() en python, je présume ?). Mais, je ne sais pas comment je peux construire un objet de liaison à partir de ma carte de hachage.

Un peu (un lot en fait), une recherche sur Internet m'a donné ça : http://refactormycode.com/codes/281-given-a-hash-of-variables-render-an-erb-template qui utilise une magie de métaprogrammation Ruby qui m'échappe.

Alors, n'y a-t-il pas une solution simple à ce problème ? Ou existe-t-il un meilleur moteur de création de modèles (non lié à HTML) mieux adapté à ce problème ? (J'ai choisi ERB uniquement parce qu'il est dans la stdlib).

0 votes

Je ne connais pas de moteurs de modèles Ruby qui soient "liés" au HTML ; un modèle est un modèle. Je ne suis pas sûr non plus de ce qui ne va pas dans la solution dont vous donnez le lien - est-ce que le problème est de placer le hash dans le module ?

0 votes

Dave, il n'y a rien de mal à cela en tant que tel. J'ai juste pensé qu'il pourrait y avoir une solution plus élégante pour un problème aussi simple que d'aller jusqu'à utiliser la métaprogrammation.

1 votes

8voto

asfer Points 888

Solution simple utilisant Reliure :

b = binding
b.local_variable_set(:a, 'a')
b.local_variable_set(:b, 'b')
ERB.new(template).result(b)

4voto

Alex D Points 14591

Si vous voulez faire les choses très simplement, vous pouvez toujours utiliser des recherches de hachage explicites dans le modèle ERB. Si vous utilisez "binding" pour passer une variable de hachage appelée "hash" dans le modèle, cela ressemblerait à ceci :

<%= hash["key"] %>

0 votes

Mais comment utiliser binding pour passer la variable de hachage ?

0 votes

C'est facile. Il suffit de stocker le hachage dans une variable. Ensuite, dans la même portée que la variable, appelez ERB.new(template).result(binding) . Kernel#binding capturera toutes les variables qui sont dans la portée, et elles seront disponibles dans le modèle ERB.

2 votes

Merci - cette information a davantage sa place dans votre réponse principale que dans un commentaire. Mais cette approche ne souffre-t-elle pas des mêmes problèmes de fuite de données et de sécurité que ceux que j'ai notés plus haut, à savoir que l'approche du instance_eval -dont souffre la réponse basée sur l'article ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X