Pergunta

Eu tenho uma string não confiável que eu quero mostrar como texto em uma página HTML. Eu preciso para escapar dos caracteres '<' e '&' como entidades HTML. A menos barulho, melhor.

Eu estou usando UTF8 e não precisam de outras entidades para letras acentuadas.

Existe um built-in função em Ruby ou Rails, ou devo fazer a minha própria?

Foi útil?

Solução

O método h helper:

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

Outras dicas

classe Caixa Ruby CGI . Existem métodos para codificar e decodificar HTML, bem como URLs.

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

Em Ruby on Rails 3 HTML será escapou por padrão.

Para strings não escapou usar:

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

ERB :: Util.html_escape pode ser em qualquer lugar usado. Ele está disponível sem usar require em Rails.

Uma adição à resposta de Christopher Bradford usar o HTML escapando em qualquer lugar, já que a maioria das pessoas não usam CGI hoje em dia, você também pode usar Rack:

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

Você pode usar h() ou html_escape(), mas a maioria das pessoas usam h() por convenção. h() é curto para html_escape() em trilhos.

Em seu controlador:

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

Na sua opinião:

<%=h @stuff %>

Se você exibir a fonte HTML: você verá a saída sem realmente negrito os dados. Ou seja, é codificado como &lt;b&gt;Hello World!&lt;/b&gt;.

Ele aparecerá um ser exibido como <b>Hello World!</b>

comparaison dos 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;"

Eu escrevi o meu próprio para ser compatível com Rails ActiveMailer escapar:

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

h() também é útil para escapar aspas.

Por exemplo, eu tenho uma visão que gera um link usando um result[r].thtitle campo de texto. O texto poderia incluir aspas simples. Se eu não escapou result[r].thtitle no método de confirmação, iria quebrar o Javascript:

&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:. A declaração de título :html é magicamente escapou pelo Rails

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top