我有几个带有长度验证的字段,可以通过输入n个空格来绕过。我正在尝试编写一种仅验证字母数字字符(而不是空格或特殊字符)数量的方法。
我已经了解了以下内容:
validates :title,
presence: true,
length: { minimum: 4, maximum: 140 },
format: { with: /([A-z0-9])/ }
我无法获得的是如何验证与格式匹配的标题的长度。例如,我想允许标题为“ The Beast”,但在字符数中仅计算“ TheBeast”。这将允许“野兽”并在长度验证中包含空格
是否在滑轨中内置了某些东西可以使我做到这一点?否则,编写自定义方法的最佳方法是什么?
预先感谢
答案 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 }