web-dev-qa-db-ja.com

考案:サインアップ中のパスワード確認を無効にする

Devise forRailsを使用しています。デフォルトの登録プロセスでは、Deviseは、検証と認証のためにユーザーがパスワードを2回入力することを要求します。どうすれば無効にできますか?

41
Victor Lam

パスワードの確認を無効にするには登録フォームからpassword_confirmationフィールドを削除するだけです。これにより、パスワードを完全に確認する必要がなくなります。

  1. まだ行っていない場合は、デバイスビューを生成します。Rails g devise:views
  2. password_confirmationapp\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_confirmationnilを返すことに注意してください。 。

password_confirmationフィールドがフォームに存在する場合、それは常にパラメーターハッシュに含まれるため、空白のままにすると空の文字列として検証がトリガーされます。ただし、フォームから入力を削除すると、paramsのpassword_confirmationnilになるため、検証はトリガーされません。

84
mistertim

モデルからattr_accessible要件を削除するだけで、それがなくても問題なく機能するようです。

ちなみに、私はこの慣行に同意します。まれにタイプミスがあった場合、ユーザーはパスワード回復を使用してパスワードを回復できます。

36
Jeff Dickey

私はDeviseに精通していませんが、保存/検証の前にコントローラーのモデルにアクセスできる場合は、次のようなことを行うことができます

model.password_confirmation = model.password
model.save
11
Will

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
3
Jimeux

最も簡単な解決策:

削除:validatable from

devise :database_authenticatable, :registerable,
 :recoverable, :rememberable, :trackable,
 :confirmable, :timeoutable, :validatable

;)

2
Nesha Zoric

フォームからpassword_confirmationフィールドを削除するだけです。

2
Robin Garg

ウィキを見る

def update_with_password(params={})
  params.delete(:current_password)
  self.update_without_password(params)
end

https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-pproving-a-password

1
Peter Ehrlich

これがパスワード確認を無効にする簡単な方法だと思います: 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になるため、検証はトリガーされません。

0
Tomoka Miyazawa

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フィールドを削除します。