2010-11-16 18 views
9

que tienen una joya rieles que utiliza un fragmento como:Rails 3.0.2 Array # join HTML ¿Seguro?

components = [] 
components << label_for(attribute) 
components << ... 
components << text_field(attribute) 
return components.join 

La gema funcionó bien en Rails 3.0.1, sin embargo, escapa (renderiza como texto en un navegador) todo el HTML después de la actualización a Rails 3.0.2 . ¿Qué estoy haciendo algo mal? Gracias.

Respuesta

12

Como @ sj26 señala, o bien utilizar los carriles incorporada ayudante:

<%= safe_join(components) %> 

O usar mi rails_join gema para hacer Array#join html-safe en cuenta, en cuyo caso su código original funcionará tal cual.

+0

nb safe_join se agregó en rails 3.1 – robd

1

Las cadenas se escapan automáticamente de HTML en Rails3. Es necesario cambiar la última línea a:

return components.join.html_safe 

alternativamente, si la edición de la joya es demasiado molestia que puede hacerlo desde el punto de vista:

<%= helper_name.html_safe %> 
+0

Gracias por la respuesta. No tuve problemas en Rails 3.0.1 con 'join' (utilizando el escape HTML más nuevo). ¿Alguna razón por la cual falla específicamente en Rails 3.0.2? Gracias. –

+0

He creado una aplicación súper simple para probar su problema y descubrí que 3.0.1 se comporta para mí, como usted dice 3.0.2. Ambos escapan del html a menos que yo diga que no (lo hice usando el método "crudo" en mi ayudante) – jwarchol

+0

Gracias JW y Adam. Acabo de hacer una prueba y estás en lo cierto. No estoy seguro de por qué mi gema estaba funcionando para la última media docena de versiones, pero esto soluciona mi problema. ¡Aclamaciones! –

9

String#join no es SafeBuffer sea conscientes.

String#html_safe marcas que su cadena ya tiene un escape de HTML, evitando que los usuarios introduzcan bits de HTML en sus páginas. Consulte this post por Yehuda Katz en SafeBuffer y por qué/cómo debe usarlos.

Si usted tiene una serie de String y SafeBuffer desea concatenar, asegúrese de que se le han acabado #html_safe sobre todos ellos, o #concat ellos en un SafeBuffer, así:

['<one>', '<p>two</p>'.html_safe].inject ''.html_safe, &:concat 
=> "&lt;one&gt;<p>two</p>" 

rieles tiene un incorporado en ayuda llamada safe_join que hará esto por usted.

+1

Esta es la mejor respuesta en mi opinión. Únete parece inherentemente inseguro. Solo una pregunta sobre el '' .html_safe. ¿Eso es solo en caso de que la primera cadena en la matriz no haya sido marcada como html_safe? Además, ¿cuál es la diferencia entre &: concat y: concat, este último parece funcionar igual para mí :) –

+2

La respuesta más correcta ahora es usar ['safe_join (array)'] [http://apidock.com/ rails/ActionView/Helpers/OutputSafetyHelper/safe_join] que es 'Array # join' que entiende' SafeBuffer'. – sj26

0

¿qué tal las cotizaciones manuales?

<%= raw ['<div>', 'any', '</div>'].map{|val| h(val)}.join('<br />') %>