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

时间:2013-08-15 20:17:45

标签: ruby-on-rails validation rails-activerecord

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

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

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

2 个答案:

答案 0 :(得分:1)

我相信没有办法从自定义调用其他验证器,这也可能导致循环依赖,这是危险的。

您必须使用条件验证,但请记住,您可以像这样对其进行范围化(取自Rails指南)

with_options if: :is_admin? do |admin|
  admin.validates :password, length: { minimum: 10 }
  admin.validates :email, presence: true
end

答案 1 :(得分:0)

如果您的目标是调用自定义和标准Rails验证程序的某种组合,则可以使用validates提供的ActiveModel::Validations方法进行操作

例如,您已经创建了一个自定义Email Validator

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

您想将其包含在您的Person类中。您可以这样:

class Person < ApplicationRecord
  attr_accessor :email

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

(将调用您的自定义验证器)和PresenceValidator。这里的所有示例均来自文档ActiveModel::Validations::Validates