跳至内容 跳至搜索

Active Model EachValidator

EachValidator 是一个验证器,它遍历 options 哈希中给定的属性,并调用 validate_each 方法,将记录、属性和值传递给该方法。

所有 Active Model 验证都是在此验证器之上构建的。

方法
C
N
V

属性

[R] attributes

类公共方法

new(options)

返回一个新的验证器实例。所有选项都将通过 options 阅读器提供,但是 :attributes 选项将被移除,而改为通过 attributes 阅读器提供。

# File activemodel/lib/active_model/validator.rb, line 140
def initialize(options)
  @attributes = Array(options.delete(:attributes))
  raise ArgumentError, ":attributes cannot be blank" if @attributes.empty?
  super
  check_validity!
end

实例公共方法

check_validity!()

由初始化程序调用的钩子方法,允许验证提供的参数是否有效。例如,您可以在提供无效选项时引发 ArgumentError

# File activemodel/lib/active_model/validator.rb, line 168
def check_validity!
end

validate(record)

对提供的记录执行验证。默认情况下,这将调用 validate_each 来确定有效性,因此子类应该使用验证逻辑覆盖 validate_each

# File activemodel/lib/active_model/validator.rb, line 150
def validate(record)
  attributes.each do |attribute|
    value = record.read_attribute_for_validation(attribute)
    next if (value.nil? && options[:allow_nil]) || (value.blank? && options[:allow_blank])
    value = prepare_value_for_validation(value, record, attribute)
    validate_each(record, attribute, value)
  end
end

validate_each(record, attribute, value)

在子类中使用验证逻辑覆盖此方法,在必要时将错误添加到记录的 errors 数组中。

# File activemodel/lib/active_model/validator.rb, line 161
def validate_each(record, attribute, value)
  raise NotImplementedError, "Subclasses must implement a validate_each(record, attribute, value) method"
end