Необязательная функция аутентификации при подтверждении пароля

#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
  

Дополнительным преимуществом является то, что вам не нужно беспокоиться о настройке или сбросе настроек в ваших контроллерах — модель продолжает обновлять атрибуты в обычном режиме.