Я использую Devise для Rails. В процессе регистрации по умолчанию Devise требует, чтобы пользователи вводили пароль дважды для проверки и аутентификации. Как я могу это отключить?
Разработать: отключить подтверждение пароля при регистрации
Ответы (9)
Чтобы отключить подтверждение пароля, вы можете просто удалить поле password_confirmation из регистрационной формы. Это полностью отключает необходимость подтверждения пароля!
- Создавайте представления разработки, если у вас нет:
rails g devise:views - Удалите раздел
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, и поэтому проверка не будет запущена.
Кажется, если вы просто удалите требование 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
Вам просто нужно удалить поле password_confirmation из вашей формы.
Самое простое решение:
Удалите : validatable из
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable,
:confirmable, :timeoutable, :validatable
;)
См. Вики
def update_with_password(params={})
params.delete(:current_password)
self.update_without_password(params)
end
Проверки по умолчанию для 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 из формы регистрации.
Я думаю, что это простой способ отключить подтверждение пароля: 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 будет равен нулю, и, следовательно, проверка не будет запущена.