2010-05-07 18 views
3

J'ai le problème suivant: J'ai rhtml (html haché avec ruby ​​à l'intérieur <%%> et <% =%> tags) stocké dans une base de données que je veux rendre. L'information est acquise à travers une requête. Je dois être capable d'évaluer les informations que je reçois de la base de données comme si c'était un contenu normal dans le fichier .erb. Ce que j'ai actuellement:Rendu d'une variable avec erb

<% @mymods.each do |mod| %> 
<%= render_text(mod["html"])%> 
<% end %> 

Où [ « html »] mod est la variable contenant le code RHTML et @mymods un tableau d'objets de la requête. Je n'ai actuellement aucune idée de la fonction que je devrais utiliser (render_text ne fonctionne bien sûr pas).

L'aide est grandement appréciée.

/TZer0

Répondre

11

Vous pouvez utiliser l'objet ERB pour rendre le texte sans le texte étant dans un fichier.
Il suffit de passer le texte avec les balises <%= %>. Vous pourriez mettre quelque chose comme ce qui suit en tant que fonction application_helper.

def render_erb_text(text, args={}) 
    b = binding 
    template = ERB.new(text, 0, "%<>") 
    template.result(b) 
end 

Et puis dans votre modèle

<%= render_erb_text("<%= %w(hi how are you).join(' - ') %>")%> 

Vous pouvez également envisager de rendre le texte dans votre contrôleur que vous pouvez gérer toute render erreurs mieux là que lors de l'évaluation de la vue.

Jetez un oeil à la ERB documentation pour plus d'informations sur la variable de liaison, etc.

Je ne suis pas au courant des détails de la façon dont cela fonctionne sous les couvertures, mais il pourrait y avoir un risque sérieux dans l'exécution de ce code sur données de base de données mauvaises ou malveillantes. L'évaluation du code ruby ​​à partir de l'entrée de l'utilisateur ou de toute source non vérifiée doit être faite très soigneusement, voire pas du tout.

+1

Merci pour l'aide, cela a fonctionné. Désolé de ne pas pouvoir vous upvote pour cela. Je n'ai pas encore 15 représentant;) – TZer0