Разработать: отключить подтверждение пароля при регистрации

Я использую Devise для Rails. В процессе регистрации по умолчанию Devise требует, чтобы пользователи вводили пароль дважды для проверки и аутентификации. Как я могу это отключить?


person Victor Lam    schedule 08.05.2010    source источник
comment
Что делать, если человек делает опечатку при вводе пароля в одно поле? Есть причины для наличия подтверждения в формах пароля, и вы должны обязательно его удалить.   -  person Gareth    schedule 08.05.2010
comment
Ага. я хочу удалить это. для упрощения процесса регистрации. есть предложения о том, как его отключить?   -  person Victor Lam    schedule 08.05.2010
comment
@Gareth Вроде запоздалый ответ, но вы можете использовать сброс пароля электронной почты, если пользователи вводят его неправильно. Многие люди, занимающиеся удобством использования, начинают предпочитать этот подход, поскольку он проще для пользователя.   -  person LandonSchropp    schedule 08.12.2011
comment
stackoverflow.com/questions/11641901/   -  person Glass    schedule 08.07.2016


Ответы (9)


Чтобы отключить подтверждение пароля, вы можете просто удалить поле password_confirmation из регистрационной формы. Это полностью отключает необходимость подтверждения пароля!

  1. Создавайте представления разработки, если у вас нет: rails g devise:views
  2. Удалите раздел password_confirmation в app\views\devise\registrations\new.html.erb

Один из способов сделать это:

<%# 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 %>

Причина, по которой это работает, кроется в 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, и поэтому проверка не будет запущена.

person mistertim    schedule 27.11.2012
comment
Спасибо @misertim. Ты прав. На самом деле я забываю этот вопрос. Ты прав. Правильное решение - удалить поле password_confirmation. Devise просто проигнорирует проверку. - person Victor Lam; 28.11.2012
comment
@mistertim Это был умный ответ. Я был готов часами сражаться с Devise, но это оказалось довольно легко. Спасибо. - person rohitmishra; 19.12.2012
comment
Не совсем понимаю ... Если поле пароля существует, не выполняется ли проверка, даже если поле password_confirmation не выполняется? - person mrstif; 03.02.2015

Кажется, если вы просто удалите требование attr_accessible из модели, она отлично работает и без него.

Кстати, я согласен с этой практикой, в редких случаях, когда произошла опечатка, пользователь может просто использовать восстановление пароля, чтобы восстановить свой пароль.

person Jeff Dickey    schedule 24.12.2010
comment
Это должен быть правильный ответ. Предполагая, что вы используете user.rb в качестве модели разработки, просто удалите attribute_accessible для password_confirmation и удалите поле в представлении. - person Gary Haran; 19.05.2011
comment
Даже больше. В некоторых приложениях регистрация выполняется асинхронно, поэтому отправка одних и тех же данных не требуется, некоторые проверки (которые не критичны, эта - нет) могут быть выполнены в поле зрения. - person Hauleth; 06.04.2013

Я не знаком с Devise, но если у вас есть доступ к модели в контроллере перед сохранением / проверкой, вы могли бы сделать что-то вроде следующего

model.password_confirmation = model.password
model.save
person Will    schedule 09.05.2010

Ради пользователей 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
person Jimeux    schedule 04.03.2014

Вам просто нужно удалить поле password_confirmation из вашей формы.

person Robin Garg    schedule 16.07.2015

Самое простое решение:

Удалите : validatable из

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

;)

person Nesha Zoric    schedule 07.10.2014
comment
Проблема с этим ответом заключается в том, что он также удаляет проверку поля электронной почты и сложность пароля. Этот ответ также должен содержать подтверждение сложности адреса электронной почты и пароля. - person ZedTuX; 21.11.2020

См. Вики

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-providing-a-password

person Peter Ehrlich    schedule 18.07.2011

Проверки по умолчанию для Devise (lib / devise / models / validatable.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 из формы регистрации.

person Александр Андреев    schedule 30.09.2014

Я думаю, что это простой способ отключить подтверждение пароля: https://github.com/plataformatec/devise/wiki/Disable-password-confirmation-during-registration

Некоторые пользователи хотят сделать процесс регистрации короче и проще. Одно из полей, которое можно удалить, - это Подтверждение пароля.

Самое простое решение: вы можете просто удалить поле password_confirmation из регистрационной формы, расположенной по адресу devise / registrations / new.html.erb (new.html.haml, если вы используете HAML), что полностью отключает необходимость подтверждения пароля!

Причина этого кроется в lib / devise / models / validatable.rb в исходном коде Devise:

Обратите внимание, что проверка запускается только в том случае, если password_required? возвращает true, а password_required? вернет false, если поле password_confirmation равно нулю.

Поскольку поле password_confirmation присутствует в форме, оно всегда будет включаться в хэш параметров, так как пустая строка, если она не указана, запускается проверка. Однако, если вы удалите ввод из формы, password_confirmation в params будет равен нулю, и, следовательно, проверка не будет запущена.

person Tomoka Miyazawa    schedule 15.07.2016