2010-11-05 6 views
6

Recientemente tuve un problema para escapar del valor devuelto por un rendimiento en una plantilla.Cómo escapar el valor devuelto por un rendimiento

En mi diseño, cedo la descripción de la meta de modo que pueda defino de mi plantilla

<meta name="description" content="<%= yield :html_description %>" /> 

Y aquí es mi plantilla, que por desgracia, no escapa el valor como se esperaba:

<% content_for :html_description, 'hello "you" guy' %> 
<meta name="description" content="hello "you" guy" /> 

me trataron de escapar con el escaper h(), pero no funciona:

<meta name="description" content="<%= h(yield :html_description) %>" /> 
<meta name="description" content="hello "you" guy" /> 

también probé con escape_once(), pero no demasiado:

<meta name="description" content="<%= escape_once(yield :html_description) %>" /> 
<meta name="description" content="hello &amp;quot;you&amp;quot; guy" /> 

Sin embargo, concatenando el valor devuelto con una cadena, se soluciona el problema:

<meta name="description" content="<%= '' + (yield :html_description) %>" /> 
<meta name="description" content="hello &quot;you&quot; guy" /> 

¿Alguien entiende este comportamiento ?

¿Tiene una solución mejor que esta concatenación que lo arregla por coincidencia?

Estoy usando Rails 2.3.8 - ¡Gracias!

+0

Hola ¿Usted intentó ayudante escape_javascript? – Bohdan

+0

No, pero no hay javascript en este contexto. – Guillaume

Respuesta

4

la función 'h' solo escapa html no válido. El problema con su código es que las citas no son html no válidas. De lo contrario, no podría tener citas en cualquier lugar de su página web. "h" está allí para hacer cosas como activar "<script>" en "& lt; script & gt;" en lugar.

así que ... * olas mano * Este no es el método que busca.

Lo que probablemente lo resuelva es utilizar métodos de rieles para crear la metaetiqueta en sí misma, y ​​los rieles se escaparán muy bien por usted.

por ejemplo, si se trató lo siguiente:

<%= content_tag(:meta, nil, :name => 'description', :content => yield(:html_description)) %> 

acabaría con:

<meta content="hello &quot;you&quot; guy" name="description"></meta> 

Actualización:

Ah, y la razón por la cadena de concatenación hace el El truco es que las versiones más nuevas de Rails serán html-safe lo que considera una cadena sucia ... sin embargo, es un truco que no nos necesitas si utilizas una manera fácil de generar la metaetiqueta.

+1

Una razón más para usar ayudantes de rieles predeterminados, y dejar de mezclar html con código ruby. Gracias Taryn :) – Guillaume

+1

¡Gran respuesta, gracias! Espero que sea aceptado tarde o temprano. –

+0

Probablemente no sucederá ... pero oye, le digo a la gente lo que es la etiqueta de S/O en caso de que estén prestando atención. :) –

6

Para etiquetas cerradas automáticamente como meta, img o br, puede usar el método "tag".

<%= tag(:meta, :name => 'description', :content => yield(:html_description)) %> 

Esto le da

<meta content="&quot;I am surrounded by quotes&quot;" name="description" /> 
+0

Siempre me olvido de este ayudante, pero es genial para esto. –

0

Usted puede utilizar el método cruda() para hacer algo como esto:

<% microdata = "" %> 
<% microdata = "itemscope itemtype='#{yield :itemtype}'" if content_for? :itemtype %> 
<div class='container' <%= raw(microdata) %> > 
</div> 
Cuestiones relacionadas