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

是的

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

在我看来:

<%= @str %>

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


编辑 : 其中

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

如果在我看来是这样

<%raw @str %>

HTML 源代码是 <span class=\"classname\">hello</span > ,其中我真正想要的是 <span class="classname">hello</span>(没有转义双引号的反斜杠)。什么是最好的方法“不逃避”这些双引号?

183221 次浏览

您正在将业务逻辑与内容混合在一起。相反,我建议将数据发送到您的页面,然后使用类似 JQuery 的工具将数据放置到您需要的位置。

这样做的好处是可以将所有的 HTML 保存在 HTML 页面中,这样你的网页设计师就可以在以后修改 HTML,而不需要通过服务器端代码。

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

@str = "Hi"


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

至少这样你的 HTML 就在它所属的 HTML 页面中。

使用 生的:

<%=raw @str >

但是正如@jmort253所说,考虑一下 HTML 真正属于哪里。

由于您正在翻译,并从一个人的蹩脚的编码文件中挑选出您想要的代码,您可以使用 content _ tag 和 regex 结合使用吗。

从 api 文档中窃取,你可以将这些翻译过的代码插入到 content_tag中,比如:

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

由于不了解您的代码,这种想法将确保您的翻译代码过于顺从。

更新

出于安全原因,建议使用 sanitize而不是 html_safe

<%= sanitize @str %>

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

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

或者

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

使用 raw工作得很好,但它所做的只是将字符串转换为字符串,然后调用 html_safe。当我知道我有一个字符串时,我更喜欢直接调用 html_safe,因为它跳过了一个不必要的步骤,并且更清楚地显示了正在发生的事情。有关字符串转义和 XSS 保护的详细信息见 这个阿西卡斯特

你也可以使用 simple_format(@str)来删除恶意代码

或者您可以尝试 无法逃脱的 HTML方法。

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

@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 %>

如果你在使用 伊鲁比斯rails上,最短的方法是

<%== @str >

请注意双等号。 你看相关的问题,关于 SO 的更多信息。

Html _ safe 版本在 Rails 4中运行良好..。

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