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?
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 .
Utilisez brut :
<%=raw @str >
Mais comme @ jmort253 le dit correctement, considérez où le code HTML appartient vraiment.
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
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.
Ou vous pouvez essayer la méthode CGI.unescapeHTML.
CGI.unescapeHTML "<p>This is a Paragraph.</p>"
=> "<p>This is a Paragraph.</p>"
é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.
@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 %>
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? %
>