Rails 3 - raw和html_safe的问题

时间:2012-03-05 18:09:10

标签: ruby-on-rails ruby-on-rails-3

在Rails 3.0.10中使用raw和html_safe方法,我仍然无法取消html并将其显示为内容而不是<strong>Content</strong>

@object.property.html_safe给了我<strong>Some content</strong>

<%= raw(@object.property) %>也给了我<strong>Some content</strong>

我看过这些帖子,并试图实施他们的修补程序:

我还看过关于xss保护的Ryan Bates Railscasts剧集:http://railscasts.com/episodes/204-xss-protection-in-rails-3?view=comments

我根据他的名为 safe 的示例创建了一个帮助方法,其中我确保字符串内容应用了html_safe方法:

def safe(content)
    "#{content}".html_safe
end

然后我在我的模型上调用它:safe(@object.property)

内容仍未按预期显示。

我也尝试过使用清理方法,但无济于事。

导致这种情况的原因是什么?

2 个答案:

答案 0 :(得分:8)

好的,看起来我现在已经开始工作了。

查看Ruby文档并找到 CGI 类和 unescapeHTML 方法。

我在表单中使用富文本编辑器将文本保存到数据库中。显然,由于html是作为转义发送到数据库的,我需要撤消转义,然后在其上调用html_safe。

这就是它在数据库中的显示方式:&lt;strong&gt;howdy&lt;/strong&gt;

我将它应用于我的帮助方法,现在html显示为html而不是标记。

def safe(content)
  "#{ CGI::unescapeHTML(content) }".html_safe
end

这样可行,但如果有更好的方法来处理这种情况,我可以接受建议。

<强>更新


我正在尝试使用Rails帮助程序方法来尝试阻止文本被转义保存到数据库中(这样可以解决我的问题,从那时起我就不必解除它了。)

事实证明,我使用的富文本编辑器是对html进行编码 - 您必须在javascripts对象文字表示法中为其传递encoded: false的属性。

所以,如果你像我一样,并试图找出为什么Rails将文本保存为数据库编码 - 你可能实际上需要调整富文本编辑器本身的配置。

现在我可以删除CGI类,并将其用作帮助程序:

def safe(content)
  "#{ content }".html_safe
end

希望其他人也会觉得这很有帮助。

答案 1 :(得分:0)

这是另一种选择,也许是更好的选择。使用以下代码段。

plain_text = strip_tags(html_input)

以下是文档的链接。enter link description here