#ruby-on-rails #authlogic
#ruby-on-rails #authlogic
Вопрос:
Возможно ли, чтобы AuthLogic проверял подтверждение пароля, если оно присутствует, но в противном случае игнорировал его? Итак, если мои параметры следующие, я бы хотел, чтобы произошел сбой:
{ user: { password: "abcd", password_confirmation: "defg" }
Однако, если параметры вместо этого следующие, я бы хотел успеха:
{ user: { password: "abcdefgh" } }
Спасибо!
Ответ №1:
дело не в AuthLogic, этот код должен сделать свое дело:
class User < ActiveRecord::Base
...
def update_without_password_confirmation(params={})
params.delete(:password) if params[:password_confirmation].blank?
params.delete(:password_confirmation) if params[:password].blank?
update_attributes(params)
end
end
затем вызывайте этот метод из контроллера, когда вам нужно обновить атрибуты пользователя. Если пользователь не указал password_confirmation, оно будет проигнорировано.
для получения того же эффекта можно использовать несколько других методов, например, обратный вызов before_validation(:on => :update).
ОБНОВЛЕНИЕ: если вы хотите вообще пропустить проверку пароля, acts_as_authentic принимает блок для настройки его поведения:
clas User < AR::Base
acts_as_authentic do |u|
u.require_password_confirmation=false # you can also use :if => some_condition
u.validate_password_field=false
end
end
это немного недокументировано: P проверьте этот файл:
https://github.com/binarylogic/authlogic/blob/master/lib/authlogic/acts_as_authentic/password.rb
Комментарии:
1. Есть ли способ переключить его так, чтобы общее «обновление» или «создание» работало? Мне бы очень хотелось, чтобы это приложение было широким.
Ответ №2:
before_validate :check_password_confirmation
def check_password_confirmation
if self.password_confirmation.blank?
self.password = nil
end
end
Дополнительным преимуществом является то, что вам не нужно беспокоиться о настройке или сбросе настроек в ваших контроллерах — модель продолжает обновлять атрибуты в обычном режиме.