Rails-REGEX-验证非空格/特殊字符的长度

时间:2019-01-29 17:18:06

标签: ruby-on-rails regex validation activerecord

我有几个带有长度验证的字段,可以通过输入n个空格来绕过。我正在尝试编写一种仅验证字母数字字符(而不是空格或特殊字符)数量的方法。

我已经了解了以下内容:

 validates :title,
            presence: true,
            length: { minimum: 4, maximum: 140 },
            format: { with: /([A-z0-9])/ }

我无法获得的是如何验证与格式匹配的标题的长度。例如,我想允许标题为“ The Beast”,但在字符数中仅计算“ TheBeast”。这将允许“野兽”并在长度验证中包含空格

是否在滑轨中内置了某些东西可以使我做到这一点?否则,编写自定义方法的最佳方法是什么?

预先感谢

2 个答案:

答案 0 :(得分:1)

如果您有“ filtered_title”之类的辅助列,则可以这样做:

before_save :filter_title

def filter_title
  self.filtered_title = title.gsub(/[^0-9a-zA-Z]/, '') // strip unneeded chars
end

和您的验证器,但在新列上

 validates :filtered_title,
            presence: true,
            length: { minimum: 4, maximum: 140 },
            format: { with: /([A-z0-9])/ }

答案 1 :(得分:0)

为了扩展@NeverBe的答案,我同意:

class AlphanumericLengthValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    minimum_length = options.fetch(:length, 100)
    stripped_value = value ? value.gsub(/[^0-9a-zA-Z]/, '') : nil
    message = "must be at least #{minimum_length} alphanumeric characters in length"
    return if stripped_value&.length && stripped_value.length >= minimum_length
    record.errors.add(attribute, message) if !stripped_value || stripped_value.length < minimum_length
  end
end

哪个允许我这样做:

  validates :title, alphanumeric_length: { length: 8 }