Ruby on rails 从rails中的属性中删除所有html标记

Ruby on rails 从rails中的属性中删除所有html标记,ruby-on-rails,regex,Ruby On Rails,Regex,我有一个项目模型,它有一些文本属性,一个是摘要。我有一些项目的摘要中有html标记,我想将其转换为纯文本。我有一个方法,它有一个正则表达式,可以删除所有html标记 def strip_html_comments_on_data self.attributes.each{|key,value| value.to_s.gsub!(/(<[^>]+>|&nbsp;|\r|\n)/,"")} end 问题是保存项目后html标记仍然存在。我错过了什么 还有,有没有一种真

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

def strip_html_comments_on_data
  self.attributes.each{|key,value| value.to_s.gsub!(/(<[^>]+>|&nbsp;|\r|\n)/,"")}
end
问题是保存项目后html标记仍然存在。我错过了什么

还有,有没有一种真正简单的方法可以在所有模型中调用该方法

谢谢

尼古拉斯·霍克·伊萨未经测试

include ActionView::Helpers::SanitizeHelper

def foo
  sanitized_output = sanitize(html_input)
end
其中,html_输入是包含html标记的字符串

编辑

您可以通过作为选项传递
:tags=>[]
来剥离所有标记:

plain\u text=sanitize(html\u输入:标记=>[])

虽然我看到有一种更好的方法:

plain\u text=strip\u标签(html\u输入)


然后将其放入before过滤器per,就可以开始了。

首先,这里的问题是
数组#每个
返回输入数组,而不考虑块内容。我问了两个人一个问题,他们都和我一起查看了数组

第二,除了
Array#each
没有真正做你想做的事情之外,我认为你无论如何都不应该这样做。为什么需要在模型的所有属性上运行此方法

最后,为什么不保留用户的HTML输入,并在输出时使用标准的
h()
helper

# this will output as plain text
<%=h string_with_html %>
#这将作为纯文本输出
这非常有用,因为您可以查看数据库,并查看用户输入的未修改数据(如果需要)。如果您真的必须在保存值之前转换为纯文本,@zettetic的解决方案让您开始

include ActionView::Helpers::SanitizeHelper

class Comment < ActiveRecord::Base

  before_save :sanitize_html

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

end
包含ActionView::Helpers::SanitizeHelper
类注释
只需使用Zettetic提到的strip_tags()文本辅助对象

最好不要在模型中包含视图辅助对象。只需使用:

HTML::FullSanitizer.new.sanitize(text)

直接引用Rails的消毒剂,而不使用includes

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

注意:我附加了.html\u以使像
这样的html实体正确呈现。如果存在恶意JavaScript注入的可能性,请不要使用此选项。

如果您想删除
以及html标记,可以使用nokogiri

include ActionView::Helpers::SanitizeHelper

def foo
  sanitized_output = strip_tags(html_input)
  Nokogiri::HTML.fragment(sanitized_output)
end

我不是ruby用户,但那里似乎没有任何任务发生。你在计算一个字符串时去掉了这些东西,但并没有把它们保存在任何地方。@Yuliy ruby有可变字符串!(gsub!是gsub的可变形式——哎呀!)!!!(好的措施)!!!(还有+1让我看得更仔细)我不想对它进行消毒。我想把它们去掉。如果我有hello,我只想储存helloYeah!他说脱掉标签是最好的办法。非常感谢。条带标签不会移除,并且
include ActionView::Helpers::SanitizeHelper

def foo
  sanitized_output = strip_tags(html_input)
  Nokogiri::HTML.fragment(sanitized_output)
end