html - tutorial - rails render with params
Ruby on Rails: ¿cómo renderizar una cadena como HTML? (9)
yo tengo
@str = "<b>Hi</b>"
y en mi vista erb:
<%= @str %>
Lo que se mostrará en la página es: <b>Hi</b>
cuando lo que realmente quiero es Hola . ¿Cuál es la forma más fácil de "interpretar" una cadena como marcado HTML?
Editar : el caso donde
@str = "<span class=/"classname/">hello</span>"
Si en mi opinión lo hago
<%raw @str %>
El código fuente HTML es <span class=/"classname/">hello</span
> donde lo que realmente quiero es <span class="classname">hello</span>
(sin las barras diagonales que escapaban de las comillas dobles) . ¿Cuál es la mejor manera de "desactivar" esas comillas dobles?
@str = "<span class=/"classname/">hello</span>"
Si en mi opinión lo hago
<%raw @str %>
El código fuente HTML es<span class=/"classname/">hello</span>
donde lo que realmente quiero es<span class="classname">hello</span>
(sin las barras diagonales inversas) que escapaban del doble> comillas). ¿Cuál es la mejor manera de "desactivar" esas comillas dobles?
Solución: utilice comillas dobles dentro de comillas simples (o solo dentro de doble) para evitar el escape con una barra diagonal inversa.
@str = ''<span class="classname">hello</span>''
<%raw @str %>
ACTUALIZAR
Por razones de seguridad, se recomienda utilizar sanitize
lugar de html_safe
. Link
Lo que está sucediendo es que, como medida de seguridad, Rails está escapando de su cadena por usted porque podría tener código malicioso incrustado en ella. Pero si le dices a Rails que tu cadena es html_safe
, pasará directamente.
@str = "<b>Hi</b>".html_safe
<%= @str %>
O
@str = "<b>Hi</b>"
<%= @str.html_safe %>
Usar trabajos en raw
funciona bien, pero lo único que hace es convertir la cadena en una cadena y luego llamar a html_safe. Cuando sé que tengo una cadena, prefiero llamar a html_safe directamente, porque omite un paso innecesario y aclara lo que está sucediendo. Los detalles sobre la protección de XSS y escape de cadenas están en este Asciicast .
Está mezclando su lógica de negocios con su contenido. En su lugar, recomendaría enviar los datos a su página y luego usar algo como JQuery para colocar los datos donde los necesita.
Esto tiene la ventaja de mantener todo su HTML en las páginas HTML a las que pertenece, por lo que los diseñadores web pueden modificar el HTML más adelante sin tener que pasarlo por el código del lado del servidor.
O si no quieres usar JavaScript, puedes probar esto:
@str = "Hi"
<b><%= @str ></b>
Al menos de esta manera, su HTML está en la página HTML a la que pertenece.
La versión html_safe funciona bien en Rails 4 ...
<%= "<center style=/"color: green; font-size: 1.1em/" > Administrators only </center>".html_safe if current_user.admin? %
>
O puede probar el método CGI.unescapeHTML .
CGI.unescapeHTML "<p>This is a Paragraph.</p>"
=> "<p>This is a Paragraph.</p>"
Si usa rails
que utilizan Erubis , la mejor manera de hacerlo es
<%== @str >
Tenga en cuenta el doble signo igual. See pregunta relacionada en SO para obtener más información.
También puede usar simple_format(@str)
que elimina el código malicioso. Lea más aquí: http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format
Use raw :
<%=raw @str >
Pero como @ jmort253 dice correctamente, considere dónde pertenece realmente el HTML.
ya que está traduciendo, y seleccionando su código deseado del archivo codificado de una persona, podría usar content_tag, en combinación con su expresión regular.
Robando de los documentos api, puedes interpolar este código traducido en un content_tag
como:
<%= content_tag translated_tag_type.to_sym, :class => "#{translated_class}" do -%>
<%= translated_text %>
<% end -%>
# => <div class="strong">Hello world!</div>
Al no conocer su código, este tipo de pensamiento se asegurará de que su código traducido sea demasiado compatible.