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)
我担心你会觉得它很丑,但是:
在 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)
| 归档时间: |
|
| 查看次数: |
6174 次 |
| 最近记录: |