Answers:
的h
helper方法:
<%=h "<p> will be preserved" %>
h
是一个别名html_escape
检出Ruby CGI类。有编码和解码HTML以及URL的方法。
CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo "bar" <baz>"
ERB :: Util.html_escape可以在任何地方使用。不使用require
Rails 就可以使用。
CGI.escapeHTML
在下面使用
不同方法的比较:
> CGI::escapeHTML("quote ' double quotes \"")
=> "quote ' double quotes ""
> Rack::Utils.escape_html("quote ' double quotes \"")
=> "quote ' double quotes ""
> ERB::Util.html_escape("quote ' double quotes \"")
=> "quote ' double quotes ""
我写了自己的代码以与Rails ActiveMailer转义兼容:
def escape_html(str)
CGI.escapeHTML(str).gsub("'", "'")
end
h()
对于转义引号也很有用。
例如,我有一个使用文本字段生成链接的视图result[r].thtitle
。文本可以包含单引号。如果我没有result[r].thtitle
在Confirm方法中转义,则Javascript会中断:
<%= 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 %>
<a href="#" onclick="if (confirm('docs: add column &apos;dummy&apos; will be removed')) { new Ajax.Request('/resource/delete_resourced/837?owner=386&th=511', {asynchronous:true, evalScripts:true, method:'delete', parameters:'authenticity_token=' + encodeURIComponent('ou812')}); }; return false;" title="<= Remove">docs: add column 'dummy'</a>
注意::html
Rails神奇地将标题声明转义了。
&<>"'/