DeviseforRailsを使用しています。デフォルトの登録プロセスでは、Deviseは、検証と認証のためにユーザーがパスワードを2回入力することを要求します。どうすれば無効にできますか?
9 に答える
パスワードの確認を無効にするには、登録フォームからフィールドを削除するだけです。password_confirmation
これにより、パスワードを完全に確認する必要がなくなります。
- まだ行っていない場合は、デバイスビューを生成します。
rails g devise:views
password_confirmation
のセクションを削除しますapp\views\devise\registrations\new.html.erb
これが機能する理由lib/devise/models/validatable.rb
は、Deviseのソースにあります。
module Devise
module Models
module Validatable
def self.included(base)
base.class_eval do
#....SNIP...
validates_confirmation_of :password, :if => :password_required?
end
end
#...SNIP...
def password_required?
!persisted? || !password.nil? || !password_confirmation.nil?
end
end
end
end
検証は、が返さpassword_required?
れた場合にのみトリガーされ、フィールドが。の場合に返されることに注意してください。true
password_required?
false
password_confirmation
nil
フィールドがフォームに存在する場合、password_confirmation
フィールドは常にパラメータハッシュに含まれるため、空白のままにすると空の文字列として検証がトリガーされます。ただし、フォームから入力を削除すると、パラメータのpassword_confirmation
はになりnil
、検証はトリガーされません。
モデルからattr_accessible要件を削除するだけで、それがなくても問題なく機能するようです。
ちなみに、私はこの慣行に同意します。まれにタイプミスがあった場合、ユーザーはパスワード回復を使用してパスワードを回復できます。
私はDeviseに精通していませんが、保存/検証の前にコントローラーのモデルにアクセスできる場合は、次のようなことを行うことができますか?
model.password_confirmation = model.password
model.save
この質問を見つけたRails4ユーザーのために:password_confirmation
、で宣言した許可されたパラメーターから削除するだけですApplicationController.rb
。
before_filter :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) do |u|
u.permit(:username, :email, :password)
end
devise_parameter_sanitizer.for(:account_update) do |u|
u.permit(:username, :email, :password)
end
end
最も簡単な解決策:
から:validatableを削除します
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable,
:confirmable, :timeoutable, :validatable
;)
フォームからpassword_confirmationフィールドを削除するだけです。
wikiを参照してください
def update_with_password(params={})
params.delete(:current_password)
self.update_without_password(params)
end
Deviseのデフォルトの検証(lib / devise / models / validable.rb):
validates_confirmation_of :password, :if => :password_required?
と方法:
def password_required?
!persisted? || !password.nil? || !password_confirmation.nil?
end
Deviseのデフォルトのパスワード検証をオーバーライドする必要があります。Devise独自の設定によって上書きされないように、最後に次のコードを配置します。
validates_confirmation_of :password, if: :revalid
def revalid
false
end
そして、モデルは次のようになります。
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable,
:confirmable, :timeoutable, :validatable
validates_confirmation_of :password, if: :revalid
def revalid
false
end
end
次に、登録フォームからpassword_confirmationフィールドを削除します。
これがパスワード確認を無効にする簡単な方法だと思います: https ://github.com/plataformatec/devise/wiki/Disable-password-confirmation-during-registration
一部のユーザーは、登録プロセスをより短く、より簡単にしたいと考えています。削除できるフィールドの1つは、パスワードの確認です。
最も簡単な解決策は次のとおりです。devise/registrations/ new.html.erb(HAMLを使用している場合はnew.html.haml)にある登録フォームからpassword_confirmationフィールドを削除するだけで、パスワードを完全に確認する必要がなくなります。
この理由は、Deviseソースのlib / devise / models/validatable.rbにあります。
password_required?の場合にのみ検証がトリガーされることに注意してください。trueを返し、password_required?password_confirmationフィールドがnilの場合、falseを返します。
password_confirmationフィールドがフォームに存在する場合、それは常にパラメーターハッシュに含まれるため、空白のままにすると空の文字列として検証がトリガーされます。ただし、フォームから入力を削除すると、paramsのpassword_confirmationはnilになるため、検証はトリガーされません。