2012-05-20 16 views
11

He lo heredado la siguiente cadena (que no puede hacer nada sobre el formato):unescape HTML cadena

<iframe \n class=\"some_class\"\n type=\"text/html\" \n src=\"/embed/iframe_content.html?id=tsqA5D7_z10\" \n width=\"960\" \n height=\"593\" \n marginwidth=\"0\" \n marginheight=\"0\" \n frameborder=\"0\">\n</iframe> 

estoy haciéndolo en una plantilla erb así:

<%= the_string %> 

Al momento en que se presenta como un texto como este:

&lt;iframe class="some_class" type="text/html" src="/embed/iframe_content.html?id=tsqA5D7_z10" width="960" height="593" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt; 

Necesito presentarlo como HTML.

he intentado lo siguiente:

  1. <%= the_string.html_safe %> # Renders la cadena sin cambios
  2. <%= CGI.unescapeHTML(the_string) %> # Errores con un tipo de error 'no puede dup NilClass'
  3. <%= CGI.unescapeHTML(the_string).html_safe %> # Errores con un tipo de error ' no puede dup NilClass'
  4. <%= raw the_string %> # Renders la cadena sin cambios

¿Cómo puedo representar esta cadena como HTML?

Respuesta

17

como parece que se han dado cuenta, hay dos cosas que hay que tener cuidado de:

  1. representación no literal de las entidades HTML
  2. la impresión de los HTML puro en su opinión

Para el número 2 <%= raw ... %> debería funcionar bien.

Para el número 1 CGI.unescapeHTML era la idea correcta, pero no creo que reconoce todas las entidades HTML, así que recomiendo echar un vistazo a la HTML Entites gem

También puede tratar de utilizar el método simple_format ayudante, pero Creo que va a tener que pasarle algunas opciones para que permita la etiqueta

También le sugiero que cambie su lógica unescaping en un método de ayuda.

+0

Gracias por estas sugerencias. Le echaré un vistazo. – Undistraction

+0

Gracias de nuevo. La gema HTML Entites fue la respuesta. – Undistraction

1

Puede probar esto:

<%= raw the_string %> 
+0

Gracias por la sugerencia, pero no tiene ningún efecto en la cadena. – Undistraction

1

Versión 3 suena valioso. ¿Alguna razón por la que no estás usando the_string?

<%= raw CGI.unescapeHTML(the_string) %>

+0

Como menciono en mi pregunta, falla con el error Tipo Error 'no se puede duplicar NilClass' – Undistraction

+0

En su pregunta, era diferente. Todavía el mismo error? – iltempo

+0

Lo siento. Tienes razón. Pero no. Mismo resultado: escriba Error 'no se puede duplicar NilClass' – Undistraction

4

Al final tuve que usar la gema HTMLEntities sugerida por Matthew;

  1. instalada la joya con RVM y ha añadido que a mi Gemfile

  2. requerida en mi aplicación.rb

  3. La siguiente fue la única forma en que pude hacer que se procesara correctamente. Tenga en cuenta las comillas simples adicionales envueltas alrededor de la cadena. Sin ellos, los corchetes angulares no se representan, aunque todo lo demás sí lo hace.

    coder = HTMLEntities.new 
    raw coder.decode("'"+the_string+"'") 
    
7

lo que está unescape no debe ser una cadena y es por eso que está recibiendo de errores con un error de tipo can't dup NilClass

trate de hacer
s = String.new your_obj.to_s

Ahora haz

CGI.unescapeHTML(s)

+0

¿Trabajando en un controlador? Esta es la respuesta correcta, pero debe cambiar a_s -> to_str. – jqr