Почему установка validate_password_field в false отключает все проверки подлинности?

#ruby-on-rails #validation #passwords #authlogic #omniauth

#ruby-on-rails #проверка #пароли #authlogic #omniauth

Вопрос:

Я пытаюсь разрешить пользователям регистрироваться в моем приложении с помощью внешних сервисов, таких как Twitter и т.д. Следовательно, мне не нужен пароль для пользовательской модели, которую Authlogic пытается проверить. В результате я отключаю проверки пароля следующим образом:

 acts_as_authentic
before_validation :update_authlogic_config
#In the case that the user has signed up with an omniauth service.
attr_accessor :needs_no_password
def update_authlogic_config     
    validate_password_field = !needs_no_password
end
  

Все это работает достаточно хорошо, однако, похоже, также отключает проверки электронной почты / имени пользователя, которые я хочу сохранить.

В результате я обновил свой метод, чтобы убедиться, что поле электронной почты проверяется следующим образом:

 def update_authlogic_config
   validate_password_field = !needs_no_password
   ignore_blank_passwords = needs_no_password
   validate_email_field = true
end
  

Используя это, он возвращает проверки пароля, выдавая мне следующие ошибки:

Пароль слишком короткий (минимум 4 символа)

Подтверждение пароля слишком короткое (минимум 4 символа)

Есть идеи?

Ответ №1:

То, что вы ищете, — это способ просто игнорировать проверку пароля. Этот процесс называется постепенным подключением и чаще всего используется для создания учетной записи пользователя, но не требует определенных действий, пока они действительно не понадобятся пользователю для более сложных системных операций. Что вы хотите сделать, так это изменить конфигурацию authlogic в вашей модели следующим образом:

 acts_as_authentic do |c|
  c.merge_validates_confirmation_of_password_field_options({:unless => :networked?})
  c.merge_validates_length_of_password_field_options({:unless => :networked?})
  c.merge_validates_length_of_password_confirmation_field_options({:unless => :networked?})
end

def networked?
  self.authentications.any? # or true/false boolean of some kind
end
  

Я получил эту информацию из следующей сути:http://gist.github.com/436707 /

Ответ №2:

Если вы не введете поле crypted_password в пользовательскую модель, вы не получите загруженный модуль пароля, и поэтому проверки не будут выполняться.

Вы обнаружите, что это обычное поведение каждого из модулей в Authlogic.