1

ビューをレンダリングしてエラーを出力する前に、次の行を実行するコントローラーがあります。

flash[:error]="Flash error"
flash[:info] = "Flash info"

これをうまくフォーマットしたいと思います。そのために私はこのようなヘルパーを書きました

def show_flash
    a=""
    [:success, :info, :error, :warning].each do |key|
        a += content_tag(:div, flash[key], :id => key, :class => "#{key}") unless flash[key].blank?
    end
end

私の見解では、私は次のように呼びます。

<%= show_flash %>

これを実行しようとすると、Webページはdivタグ、山かっこなどを含むshow_flashの全文をレンダリングします。(FirefoxまたはChromeを使用して)要素を調べると、二重引用符で囲まれたテキストが表示されます。

次に、ヘルパーの1行を次のように変更してみました。

a = content_tag(:div, flash[key], :id=>key, :class=>"#{key]") unless flash[key].blank?

つまり、両方ではなく、最後のコンテンツタグ(エラー)のみをキャプチャします。

2番目のケースでは、Webブラウザーは、「エラー」クラスのCSSルールで正しくフォーマットされたdivタグをレンダリングしました。ブラウザにdivタグが出力されていません。

2つのcontent_tag要素を連結すると、なぜこの悲しみが生じたのですか?

私はあなたが私に与えることができるどんな助けにも感謝します。

4

2 に答える 2

3

Because "" wasn't marked as html_safe. This is part of Rails' XSS protection that is enabled by default in Rails 3.

You may find this Railscast on XSS protection informative.

于 2011-03-16T01:40:49.267 に答える
1

Rails 2 から Rails 3 に移行すると、html エスケープがデフォルトで有効になり、content_tag文字列を連結する前に明示的に無効にする必要があることがわかりました。コードは次のようになります。

def show_flash
  a=content_tag(:span, "",:escape=>false)
  [:success, :info, :error, :warning].each do |key|
    a = a+content_tag(:div, flash[key], :id => key, :class => "#{key}", :escape=>false) unless flash[key].blank?
  end     
  a
end

そのオプション:escape=>falseは、それを機能させるために必要なものです。

アンドリュー・マーシャルは私を正しい方向に向け、いくつかの検索の後、イェフダからの知恵の言葉に出くわしました. そこで、この:escape条項が明らかになりました。

于 2011-03-16T04:45:44.840 に答える