HTML标签的验证问题



数据库保存了来自输入表单的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

相关内容

  • 没有找到相关文章

最新更新