首页 > 解决方案 > 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 标签,例如很容易创建重复项。

删除标签后的重复示例:

"<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 标签后,两者都应该具有相同的值,例如,我想防止这种重复。

标签: ruby-on-railsruby-on-rails-3ruby-on-rails-4ruby-on-rails-5

解决方案


我最终将 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

推荐阅读