自定义验证器如何自动包含在模型中

时间:2017-09-07 09:46:25

标签: ruby-on-rails ruby

目前,我已经为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方法明确地包含它。

2 个答案:

答案 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

Please refer this link for more info