我在导轨指南(http://guides.rubyonrails.org/active_record_validations.html#performing-custom-validations)中进行了自定义验证,我很难理解这里发生了什么。如何使用EmailValidator?它在哪里被召唤?
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
record.errors[attribute] << (options[:message] || "is not an email")
end
end
end
class Person < ActiveRecord::Base
validates :email, presence: true, email: true
end
就像所有代码在哪里一样?
答案 0 :(得分:3)
执行传递哈希的validates
方法。当传递散列时,此方法对其进行迭代,并且对于每个键,它实例化验证器,该名称与给定键匹配。因此,如果您传递presence: true
,它会实例化PresenceValidator
的新实例,同样confirmation: true
实例化ConfirmationValidator
。如果不是true
,则值是散列,它将被传递给验证器并存储在实例变量@options
中,由options
读取器访问。