2011-12-27 4 views
1

私のRubyアプリケーションでは、ネストされたコメントをレンダリングするために再帰を使用する必要があります。ビュー内のヘルパーを使用するとHTMLがエスケープされますか?

このため、レンダリングをヘルパーの関数にオフロードすることに決めました。

機能の基本的な構造は次のようにされています

def display_comments(tree) 
    to_render = "" 
    to_render << render({:partial => 'comment', :locals => {:body => tree[:body]}}) 
    tree[:children].each do |child| 
     to_render << display_comment(child) 
    end 
    return to_render 
end 

と私はこのようにそれを呼び出すビューで:

<% if comment_forest.length > 0 %> 
    <% comment_forest.each do |tree| %> 
     <%= display_comments(tree) 
    <% end %> 
<% end %> 

しかし、Webページ上で、レールは、すべてのHTMLをエスケープし、それはこのように見える終わる:

enter image description here

答えて

3

Yあなたが戻る前におそらくhtml_safeに電話したいと思っています。 Rails 3では、サニタイズの動作が少し変更されました(XSSの保護はデフォルトで有効になっています)ので、Yehuda Katzさんのexplanation of SafeBuffers in Rails 3にリンクするthis SO discussion of raw, h, and html_safeもチェックしてみてください。

+0

涼しい、それは働いた!驚くべきことに、レールはまだユーザから入力された情報からhtmlを逃れました。この魔法は何ですか? :O –

+0

実際には、ユーザーの入力データは、表示されていないときに保存されたときにエスケープされている可能性があります。正しい? –

+1

Katzによると、安全な文字列を安全でない文字列に連結すると、安全でない文字列が最初にエスケープされます。これはおそらくここで起こっていることです。 – sczizzo

関連する問題