我有
@str = "<b>Hi</b>"
在我的观点中:
<%= @str %>
页面上显示的内容是:<b>Hi</b>
当我真正想要的是嗨。将字符串“解释”为HTML标记的红宝石方法是什么?
修改:
的情况@str = "<span class=\"classname\">hello</span>"
如果在我看来我做了
<%raw @str %>
HTML源代码为<span class=\"classname\">hello</span
&gt;我真正想要的是<span class="classname">hello</span>
(没有反斜杠转义双引号)。什么是“取消”双引号的最好方法?
答案 0 :(得分:315)
出于安全原因,建议使用sanitize
代替html_safe
。 Link
正在发生的事情是,作为安全措施,Rails正在为您转义字符串,因为它可能嵌入了恶意代码。但是如果你告诉Rails你的字符串是html_safe
,它就会直接通过它。
@str = "<b>Hi</b>".html_safe
<%= @str %>
OR
@str = "<b>Hi</b>"
<%= @str.html_safe %>
使用raw
工作正常,但它所做的只是将字符串转换为字符串,然后调用html_safe。当我知道我有一个字符串时,我更喜欢直接调用html_safe,因为它跳过了一个不必要的步骤,使它更清楚发生了什么。有关字符串转义和XSS保护的详细信息位于this Asciicast。
答案 1 :(得分:16)
答案 2 :(得分:12)
答案 3 :(得分:8)
您还可以使用simple_format(@str)
删除恶意代码。在此处阅读更多内容:http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format
答案 4 :(得分:7)
您正在将业务逻辑与内容混合在一起。相反,我建议将数据发送到您的页面,然后使用类似JQuery的东西将数据放在您需要的地方。
这样做的好处是可以将HTML中的所有HTML保留在它所属的HTML页面中,这样您的Web设计人员就可以在以后修改HTML而无需通过服务器端代码。
或者,如果您不想使用JavaScript,可以试试这个:
@str = "Hi"
<b><%= @str ></b>
至少这样,你的HTML就在它所属的HTML页面中。
答案 5 :(得分:6)
或者您可以尝试 CGI.unescapeHTML 方法。
CGI.unescapeHTML "<p>This is a Paragraph.</p>"
=> "<p>This is a Paragraph.</p>"
答案 6 :(得分:0)
因为你正在翻译,并从一个人的蹩脚编码文件中挑选你想要的代码,你可以使用content_tag,与你的正则表达式组合。
从api文档中窃取,您可以将此翻译代码插入到content_tag
中,如:
<%= content_tag translated_tag_type.to_sym, :class => "#{translated_class}" do -%>
<%= translated_text %>
<% end -%>
# => <div class="strong">Hello world!</div>
不了解您的代码,这种想法将确保您的翻译代码过于合规。
答案 7 :(得分:0)
@str = "<span class=\"classname\">hello</span>"
如果在我看来我做了
<%raw @str %>
HTML源代码是<span class=\"classname\">hello</span>
,其中我真正想要的是<span class="classname">hello</span>
(没有反斜杠转义双&gt;引号)。什么是“取消”双引号的最好方法?
解决方案:在单引号内使用双引号(或双引号中的单引号)以避免使用反斜杠转义。
@str = '<span class="classname">hello</span>'
<%raw @str %>
答案 8 :(得分:0)
html_safe版本在Rails 4中运行良好......
<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>