2012-02-09 47 views
4

In Devise Validatable模块包含 validates_uniqueness_of :email, :allow_blank => true, :if => :email_changed? 如何禁用此验证程序?在Devise中跳过电子邮件验证

+0

您是否尝试从模型中删除验证模块 – Viren 2012-03-28 13:03:52

回答

2

我怕你会发现它非常难看,但:

在1.x中色器件(我们正在谈论分支1.x的,对不对?)没有选项来选择它,所以唯一的办法就是在设计指令后删除类定义中不必要的验证器:

class用户扩展Mongoid文档(不管这里的AR是否相同,只需在下面的delete_if方法中放置AR Validator类)并包含设计初始化程序这种破解似乎有效:

User._validators[:email].try{ |validators| 
    validators.delete_if{ |validator| 
    validator.is_a? Mongoid::Validations::UniquenessValidator 
    } 
} 

所以,用户类的定义可能是:

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 
9

Devise's own documentation on the Validatable module ...

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

强调我的重点。

您应该禁用Validatable模块并推出自己的验证。

devise :database_authenticatable, :registerable, :rememberable, 
     :trackable, :timeoutable, :confirmable, :recoverable, :lockable 
     # :validatable <-- this one needs to go 

审查lib/devise/models/validatable.rb内容和相关章节拉进自己的用户类。对于目前的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 

然后做出任何改变是必要的。

真实世界的情景:我在一些项目上使用Paranoia gem,这些项目不适用于此模块。所以我删除它,并自定义电子邮件唯一性检查阅读为...

validates_uniqueness_of :email, scope: :deleted_at