2012-02-09 23 views
4

Devits Validatableモジュールには次のものが含まれています validates_uniqueness_of :email, :allow_blank => true, :if => :email_changed? このバリデータを無効にするにはどうすればよいですか?電子メールの検証をスキップする

+0

モデルから検証モジュールを削除しようとしましたか – Viren

答えて

2

私はあなたはそれが非常に醜いが、見つけることを恐れている:(?我々は正しい、分岐1.1について話している)1.xの工夫で

それを選択するためにはオプションがありませんので、

クラスユーザーはMongoidドキュメントを拡張します(ここではARは同じですが、ARはこれと同じですが、以下のdelete_ifメソッドにAR Validatorクラスを配置するだけです)。devise initializersが含まれていますので、不要なバリデータは削除してください。このハックはうまくいくようです:

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

だから、Userクラスの定義は次のようになります。Devise's own documentation on the Validatable moduleパー

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

...

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 
関連する問題