在Devise中跳过电子邮件验证

max*_*axs 10 ruby-on-rails devise

在Devise中,Validatable模块包含 validates_uniqueness_of :email, :allow_blank => true, :if => :email_changed? 如何禁用此验证器?

Fra*_*ehl 15

Per Devise自己的Validatable模块文档 ......

Validatable为用户电子邮件和密码创建所有必需的验证.它是可选的,因为您可能想要自己创建验证.自动验证电子邮件是否存在,唯一且其格式是否有效.还测试密码,确认和长度的存在.

强调我的重点.

您应该禁用该Validatable模块并滚动自己的验证.

devise :database_authenticatable, :registerable, :rememberable,
       :trackable, :timeoutable, :confirmable, :recoverable, :lockable
       # :validatable <-- this one needs to go
Run Code Online (Sandbox Code Playgroud)

查看内容lib/devise/models/validatable.rb并将相关部分拉入您自己的User类.对于当前3.2.x版本行,它应该看起来像这样......

class User < ActiveRecord::Base

  # From Devise module Validatable
  validates_presence_of   :email, if: :email_required?
  validates_uniqueness_of :email, allow_blank: true, if: :email_changed?
  validates_format_of     :email, with: email_regexp, allow_blank: true, if: :email_changed?

  validates_presence_of     :password, if: :password_required?
  validates_confirmation_of :password, if: :password_required?
  validates_length_of       :password, within: password_length, allow_blank: true

  # [ ... ] The rest of your model stuff

  protected

  # From Devise module Validatable
  def password_required?
    !persisted? || !password.nil? || !password_confirmation.nil?
  end

  # From Devise module Validatable
  def email_required?
    true
  end

end
Run Code Online (Sandbox Code Playgroud)

然后进行必要的更改.

一个现实世界的场景:我在许多项目中使用Paranoia gem,这不适用于这个模块.所以我删除它并自定义电子邮件唯一性检查以读取为...

validates_uniqueness_of :email, scope: :deleted_at
Run Code Online (Sandbox Code Playgroud)


ica*_*oli 3

我担心你会觉得它很丑,但是:

在 1.x devise 中(我们正在谈论分支 1.x,对吧?)没有选项可以选择它,所以剩下的唯一方法是在 devise 指令之后删除类定义中不必要的验证器:

class User 扩展了 Mongoid 文档(不管怎样,AR 在这里是一样的,只是将 AR Validator 类放在下面的 delete_if 方法中)并包含设计初始化器,所以这个 hack 似乎有效:

User._validators[:email].try{ |validators|
  validators.delete_if{ |validator|
    validator.is_a? Mongoid::Validations::UniquenessValidator
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,用户类定义可以是:

class User
  include Mongoid::Document
  devise :database_authenticatable, :registerable, :validatable
  _validators[:email].try{ |validators|
    validators.delete_if{ |validator|
      validator.is_a? Mongoid::Validations::UniquenessValidator
    }
  }
  # ...
end
Run Code Online (Sandbox Code Playgroud)