2012-05-20 78 views
11

我已经继承了以下字符串(我也没有办法左右格式):转义HTML字符串

<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) %>#有一个类型错误与类型错误' '不能DUP NilClass'
  3. <%= CGI.unescapeHTML(the_string).html_safe %>#错误错误can not dup NilClass'
  4. <%= raw the_string %>#呈现字符串不变

如何将此字符串呈现为HTML?

回答

17

你似乎已经注意到了,有两件事情需要打理:

  1. 在您的视图进行反向转义的HTML实体
  2. 打印原始的HTML

对于2号<%= raw ... %>应该可以正常工作。

对于1号CGI.unescapeHTML是正确的想法,但我不认为它承认所有的HTML实体,所以我会建议采取一看HTML Entites gem

您也可以尝试使用simple_format的辅助方法,但我认为你将不得不通过它一些选项,以允许标签

我也强烈建议将您的unescaping逻辑转换为辅助方法。

+0

感谢您的这些建议。我会看看。 – Undistraction

+0

再次感谢。 HTML Entites宝石是答案。 – Undistraction

1

你可以试试这个:

<%= raw the_string %> 
+0

感谢您的建议,但对字符串没有影响。 – Undistraction

1

第3版的声音是有价值的。任何你不使用the_string的原因?

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

+0

正如我在我的问题中提到它失败,错误类型错误'不能dup NilClass' – Undistraction

+0

在你的问题是不同的。还是一样的错误? – iltempo

+0

对不起。你是对的。但不是。相同的结果:类型错误'不能重复NilClass' – Undistraction

4

最后我不得不使用Matthew建议的HTMLEntities Gem;

  1. 安装了RVM宝石,并将其添加到我的Gemfile

  2. 在我的应用程序所需的IT。rb

  3. 以下是我能够正确渲染的唯一方法。请注意围绕the_string的多余单引号。没有它们,尖括号不会呈现,但其他所有内容都会呈现。

    coder = HTMLEntities.new 
    raw coder.decode("'"+the_string+"'") 
    
7

你所进行反向转义,为什么你是一个类型错误收到错误信息不能是一个字符串和多数民众can't dup NilClass

尝试做
s = String.new your_obj.to_s

现在做

CGI.unescapeHTML(s)

+0

在控制器中工作?这是正确的答案,但您必须更改to_s - > to_str。 – jqr