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 "<p>This is a Paragraph.</p>" => "<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? % >