Supongamos que tengo la siguiente cadena
@x = "<a href='#'>Turn me into a link</a>"
En mi opinión, quiero que se muestre un enlace. Es decir, no quiero que todo en @x se escape y se muestre como una cadena. ¿Cuál es la diferencia entre usar
<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
?
ruby-on-rails
erb
grautur
fuente
fuente
<%== @x %>
que hay un alias para<%= raw(@x) %>
edgeguides.rubyonrails.org/…Respuestas:
Considerando los rieles 3:
html_safe
en realidad "establece la cadena" como HTML Safe (es un poco más complicado que eso, pero básicamente lo es). De esta manera, puede devolver cadenas seguras de HTML de los ayudantes o modelos a voluntad.h
solo se puede usar desde un controlador o vista, ya que es de un ayudante. Obligará a la salida a escapar. En realidad no está en desuso, pero lo más probable es que ya no lo use: el único uso es "revertir" unahtml_safe
declaración, bastante inusual.Anteponer su expresión
raw
es en realidad equivalente a llamarto_s
encadenado conhtml_safe
él, pero se declara en un asistente, al igual queh
, por lo que solo se puede usar en controladores y vistas." SafeBuffers and Rails 3.0 " es una buena explicación sobre cómo funciona el
SafeBuffer
s (la clase que hace lahtml_safe
magia).fuente
h
nunca será desaprobado. El uso"Hi<br/>#{h@ user.name}".html_safe
es bastante común y un uso aceptado.raw
yhtml_safe
en la práctica:raw(nil)
devuelve una cadena vacía, mientrasnil.html_safe
arroja una excepción.h
no "revertirá" una declaración html_safe. Cuando una cadena eshtml_safe
,h
no hará nada.Creo que vale la pena repetirlo:
html_safe
no no HTML escapar de su cadena. De hecho, evitará que su cadena se escape.pondrá:
en su fuente HTML (¡sí, tan seguro!), mientras que:
aparecerá el cuadro de diálogo de alerta (¿estás seguro de que eso es lo que quieres?). Por lo tanto, probablemente no desee llamar
html_safe
a ninguna cadena ingresada por el usuario.fuente
html_safe
no se escapa ni se escapa . Si bien el resultado final de marcar algo como no seguro para HTML, y luego usar el escape implícito de la etiqueta ERB <% =, podría ser lo mismo que eliminar datos y luego volver a escapar en la salida, funcionalmente no está haciendo nada. Algo así como la diferencia de (6 * -1 * -1), vs. 6.La diferencia es entre Rails
html_safe()
yraw()
. Hay una excelente publicación de Yehuda Katz sobre esto, y realmente se reduce a esto:Sí,
raw()
es un contenedorhtml_safe()
que fuerza la entrada a String y luego lo invocahtml_safe()
. También es el caso queraw()
es un ayudante en un módulo, mientras quehtml_safe()
es un método en la clase String que crea una nueva instancia de ActiveSupport :: SafeBuffer, que tiene una@dirty
bandera.Consulte " Rails 'html_safe vs. raw ".
fuente
html_safe
:Marca una cadena como segura de confianza. Se insertará en HTML sin realizar escapes adicionales.
raw
:raw
es solo una envolturahtml_safe
. Úseloraw
si hay posibilidades de que la cadena seanil
.h
alias parahtml_escape
:Un método de utilidad para escapar de caracteres de etiqueta HTML. Use este método para escapar de cualquier contenido inseguro.
En Rails 3 y superiores, se usa de manera predeterminada, por lo que no necesita usar este método explícitamente
fuente
La mejor forma segura es:
<%= sanitize @x %>
¡Evitará XSS!
fuente
En términos de Rails simples:
h
elimine las etiquetas html en caracteres numéricos para que la representación no rompa su htmlhtml_safe
establece un booleano en cadena para que la cadena se considere como html saveraw
Se convierte a html_safe en cadenafuente
h
eshtml_safe
decir, el HTML se representa tal cual.