5

セキュリティ拡張機能を備えたデバイスを使用して、強力なパスワードを検証しています。

すでに取得済みのメールでアカウントを登録しようとすると、エラー ハッシュに「メールは既に取得されています」というエラーが 2 回表示されます。

私のユーザーモデルは次のようになります。

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  # :trackable deleted
  devise :database_authenticatable, :registerable, :secure_validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :firstname, :lastname, :password, :password_confirmation, :remember_me
end

:validatable( の代わりに)セキュリティ拡張機能がない:secure_validatableと、エラーが 1 回だけ発生します。

私は何を間違っていますか?


PS ボーナス質問:

そもそも特定のエラーが発生しないようにするにはどうすればよいですか? デバイスの RegistrationsController を操作する必要がありますか、それともオプションがありますか?

4

3 に答える 3

5

同じ問題がありました。

これが役立つかどうかを確認してください: https://groups.google.com/forum/?fromgroups=#!topic/plataformatec-devise/S0nxv7BK10M

于 2013-03-12T23:32:58.713 に答える
1

これが発生する本当の理由は、devise_security_extension がメールの一意性バリデーターを 2 回定義しているためです。

最初は、デフォルトのログイン フィールドの一意性バリデータを定義するときです。2 回目は、電子メール フィールドの一意性バリデータを定義するときです。

デフォルトのログイン フィールドが電子メールである場合 (これは非常に一般的です)、バリデーターが 2 回定義されます。

次のコードを初期化ファイルに入れることでこれを修正しました。電子メールがログイン属性である場合に不要なバリデーターが作成されるのを防ぎます。

module Devise
  module Models
    module SecureValidatable
      module ClassMethods
        private

        def has_uniqueness_validation_of_login?
          return true if login_attribute == :email
          super
        end
      end
    end
  end
end
于 2016-05-17T12:19:57.807 に答える
0

おそらく :validatable モジュールもアクティブになっているでしょう。デバイス設定で言及すると、 :secure_validatable はこれらの基本的なチェック (メール: 存在、一意性、パスワード: 存在) をスキップし、エラーは 1 回だけ表示されます。

デバイス:database_authenticatable、:registerable、:secure_validatable、:validatable

于 2016-01-10T07:47:42.677 に答える