Ruby on Rails:如何将字符串呈现为HTML?

Tim*_*Tim 149 html ruby string ruby-on-rails

我有

@str = "<b>Hi</b>"
Run Code Online (Sandbox Code Playgroud)

在我的观点中:

<%= @str %>
Run Code Online (Sandbox Code Playgroud)

页面上显示的内容是:<b>Hi</b>当我真正想要的是.将字符串"解释"为HTML标记的红宝石方法是什么?


编辑:案例在哪里

@str = "<span class=\"classname\">hello</span>"
Run Code Online (Sandbox Code Playgroud)

如果在我看来我做

<%raw @str %>
Run Code Online (Sandbox Code Playgroud)

HTML源代码是<span class=\"classname\">hello</span>我真正想要的是什么<span class="classname">hello</span>(没有反斜杠转义双引号).什么是"unes​​cape"那些双引号的最佳方式?

Jac*_*cob 319

UPDATE

出于安全考虑,建议使用sanitize而不是html_safe.链接


发生的事情是,作为一种安全措施,Rails正在为您转义字符串,因为它可能嵌入了恶意代码.但是如果你告诉Rails你的字符串是什么html_safe,它会直接通过它.

@str = "<b>Hi</b>".html_safe
<%= @str %>
Run Code Online (Sandbox Code Playgroud)

要么

@str = "<b>Hi</b>"
<%= @str.html_safe %>
Run Code Online (Sandbox Code Playgroud)

使用raw工作正常,但它所做的只是将字符串转换为字符串,然后调用html_safe.当我知道我有一个字符串时,我更喜欢直接调用html_safe,因为它跳过了一个不必要的步骤,使它更清楚发生了什么.有关字符串转义和XSS保护的详细信息,请参见此Asciicast.

  • 根据 /sf/ask/3120257451/ 删除消毒 (2认同)

Mic*_*tum 16

使用原始:

<%=raw @str >
Run Code Online (Sandbox Code Playgroud)

但正如@ jmort253正确地说的那样,考虑HTML真正属于哪里.


jib*_*iel 14

如果您正在rails使用Erubis - 最酷的方法是

<%== @str >
Run Code Online (Sandbox Code Playgroud)

注意双等号.有关详细信息,请参阅 SO上的相关问题.


bca*_*man 8

您还可以使用simple_format(@str)它删除恶意代码.在这里阅读更多:http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format


jmo*_*253 7

您正在将业务逻辑与内容混合在一起.相反,我建议将数据发送到您的页面,然后使用类似JQuery的东西将数据放在您需要的地方.

这样做的好处是可以将HTML中的所有HTML保留在它所属的HTML页面中,这样您的Web设计人员就可以在以后修改HTML而无需通过服务器端代码.

或者,如果您不想使用JavaScript,可以试试这个:

@str = "Hi"

<b><%= @str ></b>
Run Code Online (Sandbox Code Playgroud)

至少这种方式你的HTML在它所属的HTML页面中.


Arm*_*ega 6

或者你可以试试CGI.unescapeHTML方法.

CGI.unescapeHTML "&lt;p&gt;This is a Paragraph.&lt;/p&gt;"
=> "<p>This is a Paragraph.</p>"
Run Code Online (Sandbox Code Playgroud)