Pregunta

Tengo una cadena que no se confía que yo quiero mostrar como texto en una página HTML. Tengo que escapar de los caracteres '<' y '&' como entidades HTML. Cuanto menos alboroto, mejor.

Estoy usando UTF-8 y no necesitan otras entidades para las letras acentuadas.

¿Hay una función incorporada en Ruby o Rails, o debería rodar mi propia?

¿Fue útil?

Solución

El método h helper:

<%=h "<p> will be preserved" %>

Otros consejos

Pedido clase Rubí CGI . Hay métodos para codificar y decodificar HTML así como URLs.

CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo &quot;bar&quot; &lt;baz&gt;"

En Ruby on Rails 3 HTML se escaparon por defecto.

Para cadenas no utilizan escapado:

<%= raw "<p>hello world!</p>" %>

ERB :: Util.html_escape puede haber utilizado en cualquier lugar. Está disponible sin necesidad de utilizar require en Rails.

Una adición a la respuesta de Christopher Bradford utilizar el código HTML escapar en cualquier lugar, ya que la mayoría de la gente no utiliza CGI hoy en día, también se puede utilizar Rack:

require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')

Puede utilizar cualquiera h() o html_escape(), pero la mayoría de la gente utilizar h() por convención. h() es la abreviatura de html_escape() en rieles.

En el controlador:

@stuff = "<b>Hello World!</b>"

En su opinión:

<%=h @stuff %>

Si ve el código HTML: verá la salida sin tener que escribir en negrita los datos. Es decir. se codifica como &lt;b&gt;Hello World!&lt;/b&gt;.

aparecerá un mostrará como <b>Hello World!</b>

Comparaison de los diferentes métodos:

> CGI::escapeHTML("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

> Rack::Utils.escape_html("quote ' double quotes \"")
=> "quote &#x27; double quotes &quot;"

> ERB::Util.html_escape("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

escribí mi propia para ser compatible con los carriles ActiveMailer escapar:

def escape_html(str)
  CGI.escapeHTML(str).gsub("&#39;", "'")
end

h() también es útil para escapar comillas.

Por ejemplo, tengo una visión que genera un enlace utilizando una result[r].thtitle campo de texto. El texto podría incluir comillas simples. Si no escapé result[r].thtitle en el método de confirmación, el código JavaScript se rompería:

&lt;%= link_to_remote "#{result[r].thtitle}", :url=>{ :controller=>:resource,
:action         =>:delete_resourced,
:id     => result[r].id,
:th     => thread,                                                                                                      
:html       =>{:title=> "<= Remove"},                                                       
:confirm    => h("#{result[r].thtitle} will be removed"),                                                   
:method     => :delete %>

&lt;a href="#" onclick="if (confirm('docs: add column &amp;apos;dummy&amp;apos; will be removed')) { new Ajax.Request('/resource/delete_resourced/837?owner=386&amp;th=511', {asynchronous:true, evalScripts:true, method:'delete', parameters:'authenticity_token=' + encodeURIComponent('ou812')}); }; return false;" title="&lt;= Remove">docs: add column 'dummy'</a>

Nota:. :html la declaración del título se escapó mágicamente por los carriles

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