Ruby on Rails:如何呈现一个string为HTML?

我有

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

并在我的观点:

 <%= @str %> 

什么将显示在页面上: <b>Hi</b>什么时候我真正想要的是 。 什么是ruby的方式来解释一个string为HTML标记?


编辑 :在哪里的情况

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

如果在我看来我是这样做的

 <%raw @str %> 

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

现在发生的事情是,作为一项安全措施,Rails正在逃避你的string,因为它可能embedded了恶意代码。 但是,如果你告诉Rails你的string是html_safe ,它会通过它。

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

要么

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

使用raw工作很好,但它所做的只是将string转换为string,然后调用html_safe。 当我知道我有一个string,我更喜欢直接调用html_safe,因为它跳过了一个不必要的步骤,并使其更清楚发生了什么事情。 关于string转义和XSS保护的细节在这个Asciicast中 。

使用原始的 :

 <%=raw @str > 

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

如果你在使用Erubis的 rails上 – 最酷的方法是

 <%== @str > 

请注意双等号。 有关更多信息, 请参见 SO上的相关问题。

您也可以使用simple_format(@str)去除恶意代码。 阅读更多: http : //api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

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

这样做的好处是可以将HTML中的所有HTML保存在HTML页面中,这样您的网页devise人员就可以在以后修改HTML,而无需通过服务器端代码。

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

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

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

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

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

既然你正在翻译,并从一个人的蹩脚的编码文件挑出你想要的代码,你可以使用content_tag,与你的正则expression式的组合。

从api文档窃取,你可以插入这个翻译的代码到一个content_tag如:

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

不知道你的代码,这种想法将确保你的翻译代码太符合。

@str = "<span class=\"classname\">hello</span>"如果在我看来我是这样做的

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

解决scheme:在单引号内使用双引号(或双引号内的单引号),以避免使用反斜线进行转义。

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

html_safe版本在Rails 4中运行良好

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