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