如何在rails 5中使用ActiveModel :: EachValidator

时间:2018-03-12 07:28:34

标签: ruby-on-rails ruby-on-rails-5.1

如何使用ActiveModel::EachValidator验证特定属性。 我写了下面的代码片段。此验证不会调用保存或验证对象。

class EmailValidator < ActiveModel::EachValidator
    def validate_each(record,attribute,value)
       # Logic to check email is valid or not
    end
end

这适用于rails 3.

2 个答案:

答案 0 :(得分:1)

可与ActiveModel一起使用的简单基类:: Validations :: ClassMethods#validates_with

class User
  include ActiveModel::Validations
  validates_with EmailValidator
end

class EmailValidator < ActiveModel::Validator
  def validate(record)
     # Logic to check email is valid or not
     record.errors.add :email, "This is some complex validation"
  end
end

任何继承自ActiveModel :: Validator的类都必须实现一个名为validate的方法,该方法接受记录。

要导致验证错误,您必须直接从验证器消息中添加记录错误。

有关详细信息,请查看here

如果您只想查找电子邮件验证,那么您可以试试这个。

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attr_name, value)
    unless value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
      record.errors.add(attr_name, :email, options.merge(:value => value))
    end
  end
end

答案 1 :(得分:0)

您可以将EmailValidator类放在models/concerns目录中。然后,在模型内部,您可以使用以下示例验证email属性。

 class User < ApplicationRecord
   validates :email, presence: true, email: true
 end

当遇到EmailValidator时,Rails会在范围内寻找email: true类,然后使用validate_each方法验证属性。