Я добавляю опцию сброса пароля к своему приложению направляющих, которое использует Authlogic. Я следовал руководству здесь: http://www.binarylogic.com/2008/11/16/tutorial-reset-passwords-with-authlogic/ и все работают, как я хотел бы за исключением одной вещи: форма сброса пароля принимает пустые пароли и просто не изменяет их.
Я искал вокруг и узнал, что это - намеченное поведение по умолчанию, потому что оно позволяет Вам заставлять пользователя отредактировать формы, которые только изменяют пароль пользователя, если они вводят новый и игнорируют его иначе. Но в этом случае, я конкретно хочу осуществить проверку пароля как то, когда пользователь первоначально регистрируется. Я нашел два возможных решения для этой проблемы, но не смог выяснить, как реализовать любой из них.
1) Кто-то задал этот тот же вопрос на Google Groups:
Модель User сохраняет с пустым паролем
Ответ Ben должен был использовать @user.validate_password = true
вызвать проверку пароля. Я попробовал это, но я получаю ошибку неопределенного метода: undefined method 'validate_password_field=' for #
.
2) Кажется, существует названный параметр конфигурации Authlogic ignore_blank_passwords
. Это документируется здесь:
Модуль: Authlogic:: ActsAsAuthentic:: пароль:: Config#ignore_blank_passwords
Это похоже на него, работал бы, но мое понимание - то, что это - глобальный параметр конфигурации, который Вы используете в своей начальной букве acts_as_authentic
звоните в модель User, и я не хочу изменять ее всего приложения, поскольку у меня действительно есть регулярная форма редактирования для пользователей, где я хочу, чтобы пустые пароли были проигнорированы по умолчанию.
Кто-либо нашел решение этого?Ясно validate_password=
в журнале изменений для Authlogic 1.4.1 и ничего об этом удаленный с тех пор. Я просто использую его неправильно? Есть ли способ использовать ignore_blank_passwords
на основе на запрос?
Может быть, чтобы проверить значение параметра в контроллере? (Воздушный код):
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
Помимо решения zetetic вы можете сделать это следующим образом:
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 запись пользователя (чего не происходит, если пароль пустой). В блоке else вы можете проверить, был ли пароль пустым, и добавить соответствующее сообщение об ошибке в запись пользователя или отобразить флэш-сообщение.
Это своего рода старая ветка, но, поскольку на нее нет ответа, я опубликую это.
Мне удалось сделать это немного чище, чем другие решения, «помогая» аутентификационным проверкам с моими собственными.
Я добавил это пользователю:
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
не установлено в true в других местах, то есть).
Надеюсь, это поможет.
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