2010-12-15 4 views
3

J'ai une vue RHTML dans Rails, où la sortie provient de ma collection MongoDB. Les données sont générées correctement à l'aide d'un bloc d'itération, mais chaque fois que j'essaie d'avoir des balises HTML dans ma base de données, elles ne sont pas affichées dans la sortie HTML, elles sont simplement affichées.RHTML affichant des balises HTML en sortie

<% 
@posts.find().each do |post| 
%> 
<h1><%=post["name"]%></h1> 
<p><%=post["body"] %></p> 
<p><%=post["timestamp"]%></p> 
<% 
end 
%> 

Mais, par exemple, si je devais

<p>Test</p> 

Dans ma base de données, les balises seraient rendus, au lieu d'être imprimé.

+0

Vous ne devriez pas besoin de la 'find()' après @posts –

+0

si @posts est un objet de collection qu'il fait –

Répondre

6

Il s'agit d'une précaution de sécurité qui est désormais intégrée à Rails 3. Elle empêche les problèmes de script XSS (cross-site scripting).

Si vous ajoutez raw, vous obtiendrez la sortie souhaitée.

<% @posts.each do |post| %> 
<h1><%=raw post["name"]%></h1> 
<p><%=raw post["body"] %></p> 
<p><%=raw post["timestamp"]%></p> 
<% end %> 

Toutefois, si vous stockez HTML arbitraire créé par l'utilisateur, je ne vous recommande pas le faire à moins que vous désinfectante l'entrée avant de le stocker dans la base de données.

Edit:

Une autre option: Utilisation du sanitize helper en place de raw, par exemple <%=sanitize post["name"], :tags => "p" %> pour autoriser les étiquettes <p>.

2

En dehors de raw et .html_safe, qui donnent 100% de confiance à l'entrée de l'utilisateur, vous pouvez également utiliser sanitize pour restreindre uniquement un nombre de balises autorisé.

<% = post sanitize [ "nom"] $>

Pour les détails, voir: http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

+0

Bon point sur l'assainissement. +1 à vous et j'ai mis à jour ma réponse. –

Questions connexes