数据库保存了来自输入表单的HTML标记,我想剥离它们以进行正确的验证。我在IRB测试了下面的方法,它似乎工作得很好。然而,我不知道如何使用这个方法来做我的验证。
下面是我的模型的代码:
class Task < ActiveRecord::Base
validates strip_tag(:text), length: {minimum: 3}, uniqueness: true
def strip_tag(record)
record.split(/<.*?>/).map(&:strip).reject(&:empty?).join(' ').gsub(/s,/,',')
end
end
我面临的问题是,我正在检查唯一性和长度大于3,但由于HTML标签很容易创建重复,例如。
remove tags后的复制示例:
"<p><span style="color: #1d3d70; font-family: -apple-system, system-ui, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: #ffffff;">Testing 8449</span></p>"
和这个
"<p>Testing 8449</p>"
在删除HTML标签后两者应该具有相同的值,我想防止这种重复,例如
我认为您需要另一列,如条纹标签文本的check_sum
,并验证该列的唯一性,因此在before_validation
回调时,您剥离标签,然后计算并设置条纹标签文本的check_sum
。
# migration add new column check_sum
t.string :checksum, null: false
# model
class Task < ActiveRecord::Base
attr_accessor :striped_text
before_validation :check_sum_pure_text
validates :striped_text, length: {minimum: 3}
validates_uniqueness_of :checksum
def strip_tag(record)
# ...
end
def check_sum_pure_text
self.striped_text = strip_tag(rich_text)
# NOTE about case_sensitive
# 'user' == 'User' ???
self.checksum = Digest::MD5.hexdigest(self.striped_text)
end
end
注意:您需要多一列checksum
的原因是关于性能的,预计算checksum
列将有助于加快检查唯一性验证。
我最终将html标记剥离为值。我从想要检查的列的数据库中得到了一个集合,看看它是否唯一,并从中剥离html标记。我使用该值来查看来自数据库的集合是否包含该值。我不知道如何在数据库查询期间剥离标签。
class Task < ActiveRecord::Base
validate :check_duplicates
private
def check_duplicates
strip_txt = ActionController::Base.helpers.strip_tags(text)
errors.add(
:text,
'Text already stored. Text must be unique'
) if (
Task.select('text')
.pluck(:text)
.collect{|e|ActionController::Base.helpers.strip_tags(e)}.include? strip_txt)
end
end