tag rails link_to content_tag content ruby-on-rails ruby-on-rails-3

link_to - No escapes html en ruby on rails



content_tag link_to rails (2)

Me encontré con lo mismo y descubrí una solución más segura que usar html_safe , especialmente una vez que introduces cadenas que son dinámicas.

Primero, el código actualizado:

def good_time(long_message1, long_message2, status = true) html = "".html_safe html << "Status is #{status}, " if status html << long_message1 else html << long_message2 end html end <%= good_time(true) %>

Esto escapa el contenido long_message si no es seguro, pero lo deja sin guardar si es seguro.

Esto permite "long message for success & such." para mostrar correctamente, pero también se escapa "malicious message <script>alert(''foo'')</script>" .

La explicación se reduce a esto: ''foo''.html_safe devuelve un ActiveSupport :: SafeBuffer que actúa como una cadena en todos los sentidos excepto en uno: cuando añades una cadena a un SafeBuffer (llamando a + o <<), esa otra cadena está escapado en HTML antes de ser anexado a SafeBuffer. Cuando agrega otro SafeBuffer a SafeBuffer, no se producirá ningún escape. Rails está visualizando todas sus vistas bajo el capó utilizando SafeBuffers, por lo que el método actualizado anterior proporciona a Rails un SafeBuffer que hemos controlado para realizar long_message en long_message "según sea necesario" en lugar de "siempre".

Ahora, el mérito de esta respuesta corresponde enteramente a Henning Koch, y se explica con más detalle en Todo lo que sabes acerca de que html_safe es incorrecto . Mi resumen anterior solo intenta dar la esencia de la explicación en caso de que este enlace muera alguna vez. .

rails 3 parece escapar de todo, incluido html. He intentado usar raw () pero todavía escapa html. ¿Hay alguna solución? Este es mi ayudante que estoy usando (/helpers/application_helper.rb):

module ApplicationHelper def good_time(status = true) res = "" if status == true res << "Status is true, with a long message attached..." else res << "Status is false, with another long message" end end end

Estoy llamando al ayudante desde mi punto de vista usando este código:

<%= raw(good_time(true)) %>


Puedes usar .html_safe así:

def good_time(status = true) if status "Status is true, with a long message attached...".html_safe else "Status is false, with another long message".html_safe end end <%= good_time(true) %>