J'ai une chaîne non approuvée que je veux afficher sous forme de texte dans une page HTML. J'ai besoin d'échapper aux caractères '<
' Et '&
' En tant qu'entités HTML. Le moins de problèmes le mieux.
J'utilise UTF8 et je n'ai pas besoin d'autres entités pour les lettres accentuées.
Existe-t-il une fonction intégrée dans Ruby ou Rails, ou dois-je lancer la mienne?
La méthode d'assistance h
:
<%=h "<p> will be preserved" %>
Commander la classe Ruby CGI ]. Il existe des méthodes pour coder et décoder le HTML ainsi que les URL.
CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo "bar" <baz>"
Dans Ruby sur Rails 3 HTML sera échappé par défaut).
Pour les chaînes non échappées, utilisez:
<%= raw "<p>hello world!</p>" %>
ERB :: Util.html_escape peut être utilisé n’importe où. Il est disponible sans utiliser require
dans Rails.
Un ajout à la réponse de Christopher Bradford pour utiliser le code HTML d'échappement n'importe où, puisque la plupart des gens n'utilisent pas CGI
de nos jours, vous pouvez également utiliser Rack
:
require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')
Vous pouvez utiliser h()
ou html_escape()
, mais la plupart des gens utilisent h()
par convention. h()
est l'abréviation de html_escape()
dans Rails.
Dans votre contrôleur:
@stuff = "<b>Hello World!</b>"
A votre avis:
<%=h @stuff %>
Si vous affichez la source HTML: vous verrez la sortie sans mettre les données en gras. C'est à dire. il est codé comme <b>Hello World!</b>
.
Il apparaîtra et sera affiché comme <b>Hello World!</b>
Comparaison des différentes méthodes:
> CGI::escapeHTML("quote ' double quotes \"")
=> "quote ' double quotes ""
> Rack::Utils.escape_html("quote ' double quotes \"")
=> "quote ' double quotes ""
> ERB::Util.html_escape("quote ' double quotes \"")
=> "quote ' double quotes ""
J'ai écrit moi-même pour être compatible avec Rails ActionMailer d'échappement:
def escape_html(str)
CGI.escapeHTML(str).gsub("'", "'")
end
h()
est également utile pour échapper des guillemets.
Par exemple, j'ai une vue qui génère un lien à l'aide d'un champ de texte result[r].thtitle
. Le texte pourrait inclure des guillemets simples. Si je ne m'échappais pas result[r].thtitle
dans la méthode de confirmation, le Javascript se briserait:
<%= link_to_remote "#{result[r].thtitle}", :url=>{ :controller=>:resource,
:action =>:delete_resourced,
:id => result[r].id,
:th => thread,
:html =>{:title=> "<= Remove"},
:confirm => h("#{result[r].thtitle} will be removed"),
:method => :delete %>
<a href="#" onclick="if (confirm('docs: add column &apos;dummy&apos; will be removed')) { new Ajax.Request('/resource/delete_resourced/837?owner=386&th=511', {asynchronous:true, evalScripts:true, method:'delete', parameters:'authenticity_token=' + encodeURIComponent('ou812')}); }; return false;" title="<= Remove">docs: add column 'dummy'</a>
Noter la :html
déclaration de titre échappe comme par magie à Rails.