Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

  1. Создавайте виды разработок, если у вас их нет: rails g devise:views
  2. Удалите раздел app\views\devise\registrations\new.html.erb 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, и, следовательно, проверка не будет запущена.

Ответ 2

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

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

Ответ 3

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

model.password_confirmation = model.password
model.save

Ответ 4

Ради 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

Ответ 5

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

Удалите : validatable из

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

;)

Ответ 7

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

Ответ 8

Выполните проверки по умолчанию (lib/devise/models/validatable.rb):

validates_confirmation_of :password, :if => :password_required?

и метод:

def password_required?
  !persisted? || !password.nil? || !password_confirmation.nil?
end

Нам нужно переопределить проверку пароля по умолчанию. Поместите следующий код в конец, чтобы он не был переопределен ни одним из собственных настроек 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 из регистрационной формы.

Ответ 9

Я думаю, что это простой способ отключить подтверждение пароля: 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 в Укажите источник:

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

Так как поле пароля_подтверждения присутствует в форме, он всегда будет включен в хэш-параметры, как пустую строку если он оставлен пустым, активируется проверка. Однако, если вы удалите вход из формы, пароль_подтверждение в params будет nil, и поэтому проверка не будет срабатывает.