目前,我已经为rails model创建了自定义电子邮件验证程序。
模型/关切/ email_validator.rb
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] || "provided format for email is not valid")
end
end
end
所以现在我可以像以下一样使用它:
validates :email, email: true, uniqueness: true
我只是好奇它是如何自动包含在模型中的?我的意思是我们没有通过使用include方法明确地包含它。
答案 0 :(得分:2)
app/
文件夹下的所有内容都已自动加载。因此,由于您已将其放在models/concerns
中且models
位于app/
下,因此会自动加载。一旦自动加载,将使用它,因为名称是从您传递给validates :email
的选项名称推断出来的。您可以将其放在app/foo/bar/baz/email_validator.rb
中,它也会自动加载。将此验证程序移至lib/email_validator.rb
,这将无效(只要您没有require
整个lib/
文件夹。)
答案 1 :(得分:0)
此外,验证器类可能位于另一个命名空间中,并且仍在任何类中使用。
validates :email, :'custom_validators/email' => true
Module CustomValidators
class EmailValidator < ActiveModel::EachValidator
# Code
end
end