Ruby on rails Rails:从自定义验证器调用标准验证

Ruby on rails Rails:从自定义验证器调用标准验证,ruby-on-rails,validation,rails-activerecord,Ruby On Rails,Validation,Rails Activerecord,有没有办法从自定义验证器中调用标准Rails验证器 我有一个OAuth/电子邮件注册/登录的组合,我希望能够在每个身份验证方法上调用某些验证器。例如,如果用户通过电子邮件注册,然后调用单个验证器,我希望能够调用电子邮件的验证唯一性,例如使用UserValidator验证 如果没有办法做到这一点,我将使用状态跟踪和一系列:If验证。我认为无法从自定义验证调用其他验证程序,这也可能导致循环依赖,这是危险的 您必须使用条件验证,但请记住,您可以这样定义它们的范围(摘自Rails指南) 如果您的目标是调

有没有办法从自定义验证器中调用标准Rails验证器

我有一个OAuth/电子邮件注册/登录的组合,我希望能够在每个身份验证方法上调用某些验证器。例如,如果用户通过电子邮件注册,然后调用单个验证器,我希望能够调用电子邮件的
验证唯一性,例如
使用UserValidator验证


如果没有办法做到这一点,我将使用状态跟踪和一系列
:If
验证。

我认为无法从自定义验证调用其他验证程序,这也可能导致循环依赖,这是危险的

您必须使用条件验证,但请记住,您可以这样定义它们的范围(摘自Rails指南)


如果您的目标是调用自定义和标准rails验证器的组合,那么可以使用
ActiveModel::Validations
提供的
validates
方法来实现

例如,您创建了一个自定义的
电子邮件验证程序

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors.add attribute, (options[:message] || "is not an email") unless
      value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
  end
end
它将调用您的自定义验证器和
PresenceValidator
。这里的所有示例都取自文档

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors.add attribute, (options[:message] || "is not an email") unless
      value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
  end
end
class Person < ApplicationRecord
  attr_accessor :email

  validates :email, presence: true, email: true
end