12

レールの自動エスケープで問題が発生しています。現在、文字列は html_safe (そうです) であると考えられていますが、表示目的で html をエスケープする必要があります。文字列が取っている手順は次のとおりです。

my_string = render(:partial => "set_string", :locals => {:item => @item})
<%= my_string %>

パーシャルは基本的に

<h2>Page Header</h2>
<strong><%= item.name %></strong>
<%= item.body %>
etc

私の理解では、テキストをビュー (h2 など) に直接表示しているため、安全であると想定されており、アイテムの出力も適切にエスケープされるため、my_string 全体が安全になります。だから、私はそれを表示しようとすると

<%= my_string %>

残りの html はエスケープしません。h を追加してエスケープを強制しようとしましたが、うまくいきませんでした。

だから私の質問は、安全ではない文字列で何かを呼び出す以外に、安全な文字列のhtmlエスケープを強制する方法はありますか?

どうもありがとうございました。

4

3 に答える 3

23

Rails 3+ の ActiveSupport::SafeBuffer からの脱出

この場合<%= my_string.to_str %>、必要に応じて二重エスケープします。

SafeBuffer の仕組み

文字列が Rails によってエスケープされると、ActiveSupport::SafeBuffer. SafeBufferその時点から、が であるため、余分なエスケープはスキップされhtml_safe?ます。賢い解決策です!しかし、そのような賢さから逃れたいと思う時があります。

なぜダブルエスケープ?

生成されたマークアップを属性に渡すために、タグ ヘルパーによって生成されたコンテンツを再度エスケープする必要がありました。data-これは、テンプレートで生成されたコードを表示する場合にも役立ちます。

Stringの強制エスケープhtml_safe?

を呼び出すto_strSafeBuffer、 が返されますString

# Example html safe content
content = content_tag :code, 'codez<>'
content.html_safe? # true

# call .to_str
escaped = content.to_str
escaped.html_safe? # false

# The escaped String will now be re-escaped when used in a template

to_s落とし穴_

メソッドはto_sメソッドによく似ていto_strます。to_sここでは使用しないでください。ActionView::SafeBuffer#to_s単に returnをコンテキストの上selfto_str呼び出しSafeBuffer、自然に unsafe を返しStringます。

于 2012-12-21T00:54:12.510 に答える
11

提案をしてくれたセバスチャンに感謝します。コメントに埋もれずに、ここで本当の答えを得たかったのです。

私はこれがうまくいくように見えます:

<%= raw CGI::escapeHTML(my_string) %>

「生の」呼び出しが必要です。それ以外の場合、escapeHTML は文字列をエスケープするだけでなく安全ではないため、自動エスケープ ダブル エスケープします。

于 2012-06-10T12:55:41.497 に答える
5

HTMLを解釈するには(必要だと私が理解したものです)、次を使用する必要があります:

<%= raw my_string %>
于 2012-06-06T09:30:17.557 に答える