【问题标题】:How to use ActiveModel::EachValidator in rails 5如何在 Rails 5 中使用 ActiveModel::EachValidator
【发布时间】:2018-03-12 07:28:33
【问题描述】:

如何使用ActiveModel::EachValidator 验证特定属性。 我已经编写了下面的 sn-p 代码。此验证不会调用保存或验证对象。

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

这适用于 rails 3。

【问题讨论】:

  • 我试图解决这个问题,但这不会调用。发了一个问题stackoverflow.com/questions/49230085/…请查收。
  • 您是否从控制器调用了电子邮件验证器?
  • 没有。我没有从任何地方调用它。在 rails 3 中,它将在保存或验证对象时自动调用。

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


【解决方案1】:

您可以将EmailValidator 类放在models/concerns 目录中。然后在您的模型中,您可以使用下面的示例验证电子邮件属性。

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

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

【讨论】:

  • 这可以作为命名约定吗?例如,如果它被称为FooValidator,然后是validates :email, presence: true, foo: true,它会起作用吗?
  • @Tashows 是的,命名约定要求它以Validator 结尾,这样您就可以使用foo: true
  • 是的,我在做了一些测试后才意识到。最终大量使用它。很有用!谢谢!
【解决方案2】:

可与 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

【讨论】:

  • ActiveModel::Validator 也为我工作。我在验证ActiveModel::EachValidator 时遇到了困难,因为我只想验证电子邮件而不是整个对象。
  • 查看我的最后评论。
猜你喜欢
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多