web-dev-qa-db-fra.com

Ruby sur Rails: comment rendre une chaîne au format HTML?

J'ai

@str = "<b>Hi</b>"

et dans ma vue erb:

<%= @str %>

Ce qui va apparaître sur la page est: <b>Hi</b> quand je veux vraiment Salut. Quelle est la manière dont Ruby pour "interpréter" une chaîne en tant que balise HTML?


Edit: le cas où

@str = "<span class=\"classname\">hello</span>"

Si à mon avis je le fais

<%raw @str %>

Le code source HTML est <span class=\"classname\">hello</span> où ce que je veux vraiment, c'est <span class="classname">hello</span> (sans les barres obliques inverses qui échappaient aux guillemets). Quelle est la meilleure façon de "décaper" ces guillemets?

148
Tim

MISE À JOUR

Pour des raisons de sécurité, il est recommandé d'utiliser sanitize au lieu de html_safe. Lien


En tant que mesure de sécurité, Rails échappe à votre chaîne car elle contient du code malveillant. Mais si vous dites Rails que votre chaîne est html_safe, elle la passera de part en part.

@str = "<b>Hi</b>".html_safe
<%= @str %>

OR

@str = "<b>Hi</b>"
<%= @str.html_safe %>

Utiliser raw fonctionne bien, mais il ne fait que convertir la chaîne en chaîne, puis appeler html_safe. Quand je sais que j'ai une chaîne, je préfère appeler html_safe directement, car cela saute une étape inutile et explique plus clairement ce qui se passe. Des détails sur la protection contre les chaînes et la sécurité XSS sont disponibles dans cet Asciicast .

318
Jacob

Utilisez brut :

<%=raw @str >

Mais comme @ jmort253 le dit correctement, considérez où le code HTML appartient vraiment.

16
Michael Stum

Si vous êtes sur Rails qui utilise Erubis - le moyen le plus cool de le faire est

<%== @str >

Notez le double signe égal. Voir question connexe sur SO pour plus d'informations.

14
jibiel

Vous pouvez également utiliser simple_format(@str) qui supprime le code malveillant. Lisez plus ici: http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

8
bcackerman

Vous mélangez votre logique métier avec votre contenu. Au lieu de cela, je vous recommande d’envoyer les données sur votre page, puis d’utiliser quelque chose comme JQuery pour placer les données à l’endroit où vous en avez besoin.

Cela présente l'avantage de conserver l'intégralité de votre code HTML dans les pages HTML correspondantes afin que vos concepteurs Web puissent modifier le code HTML ultérieurement sans avoir à passer par le code côté serveur.

Ou si vous ne voulez pas utiliser JavaScript, vous pouvez essayer ceci:

@str = "Hi"

<b><%= @str ></b>

Au moins de cette façon, votre code HTML se trouve dans la page HTML à laquelle il appartient.

7
jmort253

Ou vous pouvez essayer la méthode CGI.unescapeHTML.

CGI.unescapeHTML "&lt;p&gt;This is a Paragraph.&lt;/p&gt;"
=> "<p>This is a Paragraph.</p>"
6
Arman Ortega

étant donné que vous traduisez et que vous choisissez le code recherché dans le fichier codé pourri d'une personne, pouvez-vous utiliser content_tag, en combinaison avec celui de votre regex.

En volant des documents api, vous pourriez interpoler ce code traduit en un content_tag comme:

<%= content_tag translated_tag_type.to_sym, :class => "#{translated_class}" do -%>
<%= translated_text %>
<% end -%>
# => <div class="strong">Hello world!</div>

Ne connaissant pas votre code, ce type de réflexion vous assurera que votre code traduit est trop conforme.

0
pjammer

@str = "<span class=\"classname\">hello</span>" Si à mon avis je le fais

<%raw @str %> Le code source HTML est <span class=\"classname\">hello</span> où ce que je veux vraiment, c'est <span class="classname">hello</span> (sans les barres obliques inverses qui échappaient aux guillemets doubles). Quelle est la meilleure façon de "décaper" ces guillemets?

Solution: utilisez les guillemets doubles à l'intérieur des guillemets simples (ou simples à l'intérieur de doubles) pour éviter de s'échapper avec une barre oblique inverse.

@str = '<span class="classname">hello</span>'
<%raw @str %>
0
Crash

La version html_safe fonctionne bien dans Rails 4 ...

<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>
0
G. A.