Pregunta

Tengo un controlador que hace la siguiente línea antes de representar la vista y emitir un error.

flash[:error]="Flash error"
flash[:info] = "Flash info"

Me gustaría formatear esto bien. Por eso escribí un ayudante que se ve así

def show_flash
    a=""
    [:success, :info, :error, :warning].each do |key|
        a += content_tag(:div, flash[key], :id => key, :class => "#{key}") unless flash[key].blank?
    end
end

En mi opinión, llamo:

<%= show_flash %>

Cuando trato de ejecutar esto, la página web representa el texto completo de Show_Flash, incluidas las etiquetas DIV, los soportes de ángulo y todo. Cuando inspecciono el elemento (usando Firefox o Chrome), muestra el texto rodeado de citas dobles.

Luego intenté cambiar una línea en el ayudante de la siguiente manera:

a = content_tag(:div, flash[key], :id=>key, :class=>"#{key]") unless flash[key].blank?

es decir, solo capturaría la última etiqueta de contenido (error) en lugar de ambos.

En el segundo caso, el navegador web hizo la etiqueta DIV formateada correctamente con mis reglas CSS para la clase "Error". No vi ninguna etiqueta Div impresa en el navegador.

¿Por qué la concatenación de dos elementos content_tag me causó este dolor?

Aprecio cualquiera ayuda que me puedas proporcionar.

¿Fue útil?

Solución 2

Resulta que cuando va de Rails 2 a Rails 3, la escapada HTML está habilitada de forma predeterminada, y debe deshabilitarlo explícitamente antes de concatenarlo content_tag instrumentos de cuerda. El código parece:

def show_flash
  a=content_tag(:span, "",:escape=>false)
  [:success, :info, :error, :warning].each do |key|
    a = a+content_tag(:div, flash[key], :id => key, :class => "#{key}", :escape=>false) unless flash[key].blank?
  end     
  a
end

Esa opción, :escape=>false es lo que se necesitó para que funcionara.

Andrew Marshall me señaló en la dirección correcta, y después de buscar, me topé con el Palabras de sabiduría de Yehuda. Ahí es donde el :escape La cláusula se volvió obvia.

Otros consejos

Porque "" no estaba marcado como html_safe. Esto es parte de la protección XSS de Rails que está habilitada de forma predeterminada en Rails 3.

Puedes encontrar esto Railscast en la protección XSS informativo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top