13

次の文字列を継承しています (形式については何もできません)。

 <iframe \n  class=\"some_class\"\n  type=\"text/html\" \n  src=\"/embed/iframe_content.html?id=tsqA5D7_z10\" \n  width=\"960\" \n  height=\"593\" \n  marginwidth=\"0\" \n  marginheight=\"0\" \n  frameborder=\"0\">\n</iframe>

次のようなerbテンプレートでレンダリングしています:

<%= the_string %>

現時点では、次のようなテキストとしてレンダリングされます。

&lt;iframe  class="some_class" type="text/html" src="/embed/iframe_content.html?id=tsqA5D7_z10" width="960" height="593"  marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

HTMLとしてレンダリングする必要があります。

私は次のことを試しました:

  1. <%= the_string.html_safe %> # 文字列を変更せずにレンダリングします
  2. <%= CGI.unescapeHTML(the_string) %># Type Error 'can't dup NilClass' のエラー
  3. <%= CGI.unescapeHTML(the_string).html_safe %># Type Error 'can't dup NilClass' のエラー
  4. <%= raw the_string %># 文字列を変更せずにレンダリングします

この文字列を HTML としてレンダリングするにはどうすればよいですか?

4

5 に答える 5

20

お気づきのように、注意が必要なことが2つあります。

  1. HTMLエンティティのエスケープを解除する
  2. ビューに生のHTMLを印刷する

2番<%= raw ... %>は問題なく動作するはずです。

1番CGI.unescapeHTMLは正しい考えでしたが、すべてのHTMLエンティティを認識するとは限らないので、HTMLエンティティの宝石を確認することをお勧めします。

simple_formatヘルパーメソッドを試して使用することもできますが、<iframe>タグを許可するには、いくつかのオプションを渡す必要があると思います。

unescapingまた、ロジックをヘルパーメソッドに移動することを強くお勧めします。

于 2012-05-21T00:09:45.133 に答える
8

エスケープ解除しているものは文字列であってはなりません。そのため、タイプエラーでエラーが発生していますcan't dup NilClass

やってみる
s = String.new your_obj.to_s

今やります

CGI.unescapeHTML(s)

于 2013-04-21T17:35:32.000 に答える
4

最終的に、マシューが提案したHTMLEntities Gemを使用する必要がありました。

  1. RVMでgemをインストールし、Gemfileに追加しました

  2. 私のapplication.rbでそれを必要としました

  3. 以下は、正しくレンダリングできる唯一の方法でした。the_string を一重引用符で囲んでいることに注意してください。それらがなければ、山括弧はレンダリングされませんが、他のすべてはレンダリングされます。

    coder = HTMLEntities.new
    raw coder.decode("'"+the_string+"'")
    
于 2012-05-21T01:34:51.300 に答える
1

これを試すことができます:

<%= raw the_string %>
于 2012-05-20T23:01:19.517 に答える
1

バージョン 3 は価値があるように思えます。the_string を使用していない理由はありますか?

<%= raw CGI.unescapeHTML(the_string) %>

于 2012-05-20T23:30:16.447 に答える