Devise forRailsを使用しています。デフォルトの登録プロセスでは、Deviseは、検証と認証のためにユーザーがパスワードを2回入力することを要求します。どうすれば無効にできますか?
パスワードの確認を無効にするには登録フォームからpassword_confirmation
フィールドを削除するだけです。これにより、パスワードを完全に確認する必要がなくなります。
Rails g devise:views
password_confirmation
のapp\views\devise\registrations\new.html.erb
セクションを削除しますそれを行う1つの方法:
<%# Disable password confirmation so that the user doesn't have to enter a password twice %>
<% if false %>
<div class="field">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
</div>
<% end %>
これが機能する理由は、Deviseソースのlib/devise/models/validatable.rb
にあります。
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
フィールドがフォームに存在する場合、それは常にパラメーターハッシュに含まれるため、空白のままにすると空の文字列として検証がトリガーされます。ただし、フォームから入力を削除すると、paramsのpassword_confirmation
はnil
になるため、検証はトリガーされません。
モデルからattr_accessible要件を削除するだけで、それがなくても問題なく機能するようです。
ちなみに、私はこの慣行に同意します。まれにタイプミスがあった場合、ユーザーはパスワード回復を使用してパスワードを回復できます。
私はDeviseに精通していませんが、保存/検証の前にコントローラーのモデルにアクセスできる場合は、次のようなことを行うことができます
model.password_confirmation = model.password
model.save
Rails 4人のユーザーがこの質問を見つけた場合は、: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 from
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable,
:confirmable, :timeoutable, :validatable
;)
フォームからpassword_confirmationフィールドを削除するだけです。
ウィキを見る
def update_with_password(params={})
params.delete(:current_password)
self.update_without_password(params)
end
これがパスワード確認を無効にする簡単な方法だと思います: 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になるため、検証はトリガーされません。
Deviseのデフォルトの検証(lib/devise/models/validatatable.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フィールドを削除します。