2011-03-16 3 views
1

私はビューをレンダリングしてエラーを出力する前に次の行を行うコントローラを持っています。Rails:Views:content_tag helpers

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ページを含む、show_flashのフルテキストをレンダリングdivタグ、山括弧、およびすべて。要素を調べると(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要素を連結すると、なぜこの悲しみが生じましたか?

私に教えていただけると助かります。

+1

Rails 3を使用していますか? –

+0

私はRails 3.0.5を使用しており、元のコードはRails 2.3.9で書かれています。 –

答えて

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は、それはそれを動作させるためにかかったものです。

Andrew Marshallは正しい方向に私を指差し、検索した後、私はwords of wisdom from Yehudaを見つけました。これは、:escapeが明らかになったところです。

3

""html_safeとマークされていないためです。これは、Rails 3のデフォルトで有効になっているRailsのXSS保護の一部です。

この情報はお役に立ちましたか?Railscast on XSS protection

+0

ポインタAndrewありがとう。私は解決策を見つけた。 –

関連する問題