HTMLページのテキストとして表示したい信頼できない文字列があります。文字 '<
'および '&
'をHTMLエンティティとしてエスケープする必要があります。大騒ぎが少ないほど良い。
私はUTF8を使用していますが、アクセント付き文字に他のエンティティは必要ありません。
RubyまたはRailsに組み込み関数がありますか、それとも独自の関数をロールバックする必要がありますか?
h
ヘルパーメソッド:
<%=h "<p> will be preserved" %>
Ruby CGI クラスをチェックアウトします。 HTMLおよびURLをエンコードおよびデコードする方法があります。
CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo "bar" <baz>"
Ruby on Rails 3 HTMLはデフォルトでエスケープされます。
エスケープされていない文字列の場合:
<%= raw "<p>hello world!</p>" %>
ERB :: Util.html_escape はどこでも使用できます。 Railsでrequire
を使用せずに使用できます。
ほとんどの人はCGI
を使用していないため、HTMLエスケープをどこでも使用するというChristopher Bradfordの回答に加えて、Rack
も使用できます。
require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')
h()
またはhtml_escape()
のいずれかを使用できますが、ほとんどの人は慣例によりh()
を使用します。 h()
はRailsのhtml_escape()
の略です。
コントローラーで:
@stuff = "<b>Hello World!</b>"
あなたの見解では:
<%=h @stuff %>
HTMLソースを表示すると、実際にデータを太字にせずに出力が表示されます。つまり<b>Hello World!</b>
としてエンコードされます。
<b>Hello World!</b>
として表示されます
さまざまな方法の比較:
> 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
を使用してリンクを生成するビューがあります。テキストには一重引用符を含めることができます。 confirmメソッドでresult[r].thtitle
をエスケープしなかった場合、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によって魔法のようにエスケープされます。