Форма валидации пустых паролей в authLogic
-
24-09-2019 - |
Вопрос
Я добавляю функцию сброса пароля в приложение My Rails, которое использует authLogic. Я следил за руководством здесь: http://www.binarylogic.com/2008/11/16/0/tutorial-reset-passwords-with-with-with- И все работает, как я бы хотел, кроме как только для одной вещи: форма сброса пароля принимает пустые пароли и просто не меняет их.
Я искал вокруг, и узнал, что это предполагаемое поведение по умолчанию, потому что он позволяет делать формы редактирования пользователя, которые изменяют только пароль пользователя, если они вводят в новую и игнорируют его в противном случае. Но в этом случае я специально хочу обеспечить проверку пароля, как когда пользователь изначально регистрирует. Я нашел два возможных решения этой проблемы, но не смог понять, как реализовать любой из них.
1) Кто-то задал этот же вопрос в группах Google:
Модель пользователя сохраняет пустой пароль
Ответ Бена должен был использовать @user.validate_password = true
Чтобы заставить проверку пароля. Я попробовал это, но я получаю неопределенный метод ошибки: undefined method 'validate_password_field=' for #<User>
.
2), кажется, вызывается опция конфигурации authLogic ignore_blank_passwords
. Отказ Здесь документировано:
Модуль: authLogic :: actsasauthentic :: Пароль :: config # lightore_blank_Passwords
Похоже, это будет работать, но мое понимание в том, что это глобальная опция конфигурации, которую вы используете в своем начальном acts_as_authentic
Вызов в пользовательской модели, и я не хочу изменять его на применение, так как у меня есть регулярная форма редактирования для пользователей, где я хочу, чтобы пустые пароли были игнорированы по умолчанию.
Кто-нибудь нашел решение этого? я понимаю validate_password=
В журнале изменений для authLogic 1.4.1 и ничего об этом не удалось с тех пор. Я просто использую его неправильно? Есть ли способ использовать ignore_blank_passwords
на основании за запрос?
Решение
Это то, что я сделал.
class User < ActiveRecord::Base
attr_accessor :ignore_blank_passwords
# object level attribute overrides the config level
# attribute
def ignore_blank_passwords?
ignore_blank_passwords.nil? ? super : (ignore_blank_passwords == true)
end
end
Теперь в вашем контроллере установите ignore_blank_passwords
атрибут false.
user.ignore_blank_passwords = false
Здесь вы работаете в пределах authLicic. Вам не нужно менять логику проверки.
Другие советы
Это своего рода старая нить, но так как он не содержится в без ответа, я опубликую это.
Мне удалось сделать это немного более чистые, чем другие решения, «помогая» авторитетные проверки самостоятельно.
Я добавил это пользователю:
class User < ActiveRecord::Base
...
attr_writer :password_required
validates_presence_of :password, :if => :password_required?
def password_required?
@password_required
end
...
end
Вы можете уменьшить его до двух строк, сделав attr_accessor
и использовать :if => :password_required
(Нет допроса), но я предпочитаю этот другой синтаксис с помощью знака допроса.
Тогда действие вашего контроллера можно сделать подобное:
def update
@user.password = params[:user][:password]
@user.password_confirmation = params[:user][: password_confirmation]
@user.password_required = true
if @user.save
flash[:notice] = "Password successfully updated"
redirect_to account_url
else
render :action => :edit
end
end
Это будет иметь местный эффект; Остальная часть приложения не будет затронута (если password_required
установлен в истину в других местах, то есть).
Я надеюсь, что это помогает.
User.ignore_blank_passwords = false
Используйте модель, а не объект для настройки этого свойства.
def update_passwords
User.ignore_blank_passwords = false
if @user.update_attributes(params[:user])
...
end
User.ignore_blank_passwords = true
end
Может быть, проверьте значение параметра в контроллере? (Воздушный код):
def update
@user.password = params[:user][:password]
@user.password_confirmation = params[:user][: password_confirmation]
if @user.password.blank?
flash[:error] = "Password cannot be blank"
render :action => :edit
return
end
if @user.save
flash[:notice] = "Password successfully updated"
redirect_to account_url
else
render :action => :edit
end
end
Помимо зотетического решения, вы могли бы сделать это таким образом:
def update
@user.password = params[:user][:password]
@user.password_confirmation = params[:user][: password_confirmation]
if @user.changed? && @user.save
flash[:notice] = "Password successfully updated"
redirect_to account_url
else
render :action => :edit
end
end
Вы в основном проверяете, изменял ли authLogic Record user (который не так, если пароль пуст). В остальном блоке вы можете проверить, был ли пароль пустым и добавить соответствующее сообщение об ошибке для записи пользователя или отобразить вспышку.