2010-04-05 43 views
11

我有一个Project模型,它有一些文本属性,一个是摘要。我有一些在摘要中有html标签的项目,我想将其转换为纯文本。我有这个方法,有一个正则表达式,将删除所有的HTML标签。从rails中的属性中删除所有html标记

def strip_html_comments_on_data 
    self.attributes.each{|key,value| value.to_s.gsub!(/(<[^>]+>|&nbsp;|\r|\n)/,"")} 
end 

我也有一个before_save过滤

before_save :strip_html_comments_on_data 

的问题是,html标签仍然存在保存项目之后。我错过了什么?

而且,是否有一种非常简单的方法可以在所有模型中调用该方法?

谢谢,

尼古拉斯鹤伊萨萨

+2

我不是一个红宝石用户,但似乎没有任何被分配在那里出现。你正在计算一个带有这些东西的字符串,但不会在任何地方保存。 – Yuliy 2010-04-05 00:21:42

+0

@Yuliy红宝石有可变的字符串! (gsub!是gsub - ick!的可变形式!)!!! (为好措施)! (+1让我更难看) – 2010-04-05 04:55:51

回答

44

未测试

include ActionView::Helpers::SanitizeHelper 

def foo 
    sanitized_output = sanitize(html_input) 
end 

其中html_input是包含HTML标记的字符串。

编辑

你可以通过:tags=>[]作为一个选项去除所有标签:

plain_text = sanitize(html_input, :tags=>[])

虽然读docs我看到有一个更好的方法:

plain_text = strip_tags(html_input)

然后根据smotchkiss将它变成过滤器之前,你很好去。

+0

我不想消毒。我想删除它们。如果我有你好我想只存储你好 – Hock 2010-04-05 13:54:52

+0

查看编辑版本 – zetetic 2010-04-05 15:25:35

+0

是啊!他strip_tags是最好的选择。谢谢! – Hock 2010-04-07 11:53:59

1

首先,这里的问题是Array#each返回输入数组,无论块内容如何。有一对夫妇在我问了一个问题时刚刚跟着我走过Array#each"Return hash with modified values in Ruby"

第二,除了Array#each没有真正做到你想要的东西在这里,我认为你不应该这样做。为什么你需要通过全部这个模型的属性来运行这个方法?

最后,为什么不保留来自用户的HTML输入,并在输出时只使用标准h()助手?

# this will output as plain text 
<%=h string_with_html %> 

这是有用的,因为你可以查看数据库并看到未修改的数据正是因为它是由用户输入(如果需要)。如果你真的必须在保存值之前转换为纯文本,@ zetetic的解决方案可以让你开始。

include ActionView::Helpers::SanitizeHelper 

class Comment < ActiveRecord::Base 

    before_save :sanitize_html 

    protected 
    def sanitize_html 
    self.text = sanitize(text) 
    end 

end 
4

只需使用用strip_tags()文本助手,通过探究性

10

提到这将是最好不要在您的模型视图助手。只需使用:

HTML::FullSanitizer.new.sanitize(text) 
1

参考Rails的杀菌剂直接不使用包括。

def text 
    ActionView::Base.full_sanitizer.sanitize(html).html_safe 
end 

注:我附加.html_safe使HTML实体,如&nbsp;正确呈现。如果存在恶意JavaScript注入的可能性,请不要使用它。

0

如果你想使用HTML标签一起拔出&nbsp;,引入nokogiri可用于

include ActionView::Helpers::SanitizeHelper 

def foo 
    sanitized_output = strip_tags(html_input) 
    Nokogiri::HTML.fragment(sanitized_output) 
end 
相关问题