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_safeen 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.hsolo 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_safedeclaración, bastante inusual.Anteponer su expresión
rawes en realidad equivalente a llamarto_sencadenado 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
SafeBuffers (la clase que hace lahtml_safemagia).fuente
hnunca será desaprobado. El uso"Hi<br/>#{h@ user.name}".html_safees bastante común y un uso aceptado.rawyhtml_safeen la práctica:raw(nil)devuelve una cadena vacía, mientrasnil.html_safearroja una excepción.hno "revertirá" una declaración html_safe. Cuando una cadena eshtml_safe,hno hará nada.Creo que vale la pena repetirlo:
html_safeno 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_safea ninguna cadena ingresada por el usuario.fuente
html_safeno 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@dirtybandera.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:rawes solo una envolturahtml_safe. Úselorawsi hay posibilidades de que la cadena seanil.halias 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:
helimine las etiquetas html en caracteres numéricos para que la representación no rompa su htmlhtml_safeestablece un booleano en cadena para que la cadena se considere como html saverawSe convierte a html_safe en cadenafuente
heshtml_safedecir, el HTML se representa tal cual.