2012-02-09 2 views

ответ

2

Я боюсь, что вы найдете, что это очень некрасиво, но:

В 1.x завещанию (речь идет о веткой 1.x, верно?) Нет никаких вариантов, чтобы выбрать его, таким образом, остается только удалить ненужный валидатор в определении класса после директив разработки:

класс Пользователь расширяет документ Mongoid (без матер, AR здесь же, просто разместите класс AR Validator в методе delete_if ниже) и содержит инициализаторы разработки, поэтому этот взлом, похоже, работает:

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

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

подтверждаемых создает все необходимые валидаций для пользователя электронной почты и пароль. Это необязательно, так как вы можете захотеть создать валидации самостоятельно. Автоматически проверять, присутствует ли электронное письмо, уникальный и его формат. Также проверяет наличие пароля, подтверждения и длины.

Смелый мой акцент.

Вы должны отключить модуль Validatable и свернуть свои собственные проверки.

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

Обзор содержание 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 

Затем сделайте изменения, которые необходимы.

Сценарий реального мира: Я использую Paranoia gem для ряда проектов, которые не будут работать с этим модулем. Поэтому я удаляю его и настраиваю проверку уникальности электронной почты, чтобы читать как ...

validates_uniqueness_of :email, scope: :deleted_at 
Смежные вопросы