web-dev-qa-db-ja.com

Ruby on Rails:文字列をHTMLとしてレンダリングする方法

私は持っています

@str = "<b>Hi</b>"

そして私のエルブビューで:

<%= @str %>

ページに表示されるものは、<b>Hi</b>本当に欲しいものが こんにちは。文字列をHTMLマークアップとして「解釈」するRubyの方法は何ですか?


編集:の場合

@str = "<span class=\"classname\">hello</span>"

私の意見では

<%raw @str %>

HTMLソースコードは<span class=\"classname\">hello</span>で、ここで本当に欲しいのは<span class="classname">hello</span>です(二重引用符をエスケープするバックスラッシュなし)。これらの二重引用符を「エスケープ」する最良の方法は何ですか?

146
Tim

更新

セキュリティ上の理由から、html_safeの代わりに sanitize を使用することをお勧めします。 リンク


セキュリティ対策として、Railsに悪意のあるコードが埋め込まれている可能性があるため、文字列をエスケープしています。しかし、あなたの文字列がhtml_safeであることをRailsに伝えると、それはそのまま渡されます。

@str = "<b>Hi</b>".html_safe
<%= @str %>

OR

@str = "<b>Hi</b>"
<%= @str.html_safe %>

rawを使用しても問題ありませんが、文字列を文字列に変換してからhtml_safeを呼び出すだけです。文字列があることがわかったら、html_safeを直接呼び出すことを好みます。これは、不要なステップをスキップし、何が起こっているかを明確にするためです。文字列エスケープとXSS保護の詳細は this Asciicast にあります。

316
Jacob

raw を使用します。

<%=raw @str >

しかし、@ jmort253が正しく言っているように、HTMLが実際にどこに属しているかを考慮してください。

16
Michael Stum

Erubis を利用するRailsを使用している場合—最もクールな方法は

<%== @str >

二重等号に注意してください。 参照 詳細については、SOに関する関連質問.

12
jibiel

悪意のあるコードを削除するsimple_format(@str)を使用することもできます。詳細はこちら: http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

8
bcackerman

ビジネスロジックとコンテンツを混在させています。代わりに、ページにデータを送信し、JQueryなどを使用して、データを必要な場所に配置することをお勧めします。

これには、すべてのHTMLが属するHTMLページにすべてのHTMLを保持するという利点があります。そのため、Webデザイナーは、サーバー側のコードを流さなくても、後でHTMLを変更できます。

または、JavaScriptを使用したくない場合は、これを試すことができます。

@str = "Hi"

<b><%= @str ></b>

少なくともこの方法では、HTMLはそれが属するHTMLページにあります。

7
jmort253

または、CGI.unescapeHTMLメソッドを試すことができます。

CGI.unescapeHTML "&lt;p&gt;This is a Paragraph.&lt;/p&gt;"
=> "<p>This is a Paragraph.</p>"
6
Arman Ortega

あなたが翻訳し、人のくだらないコード化されたファイルからあなたの欲しいコードを選ぶので、あなたは正規表現と組み合わせてcontent_tagを使うことができます。

APIドキュメントから盗み、この翻訳されたコードをcontent_tagのように補間できます:

<%= content_tag translated_tag_type.to_sym, :class => "#{translated_class}" do -%>
<%= translated_text %>
<% end -%>
# => <div class="strong">Hello world!</div>

あなたのコードを知らないので、この種の考え方はあなたの翻訳されたコードがあまりにも準拠していることを確認します。

0
pjammer

@str = "<span class=\"classname\">hello</span>"私の意見では

<%raw @str %> HTMLソースコードは<span class=\"classname\">hello</span>で、ここで本当に欲しいのは<span class="classname">hello</span>です(二重引用符をエスケープするバックスラッシュなし)。これらの二重引用符を「エスケープ」する最良の方法は何ですか?

解決策:バックスラッシュでエスケープしないように、単一引用符の内側に二重引用符を使用します(または二重の内側に単一引用符を使用します)。

@str = '<span class="classname">hello</span>'
<%raw @str %>
0
Crash

Html_safeバージョンはRails 4 ...

<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>
0
G. A.