Проверка пароля Ruby on Rails
Итак, у меня есть интересные требования к проверке пароля:
-
Когда пользователь подписывается, я хочу, чтобы они вводили пароль и подтверждали и находились между 6..40
(ПОЛУЧИТЕ ЭТУ РАБОТУ 100%)
-
Когда пользователь обновляет свой профиль, применяются те же правила валидации (ПОЛУЧИТЕ ЭТУ РАБОТУ 100%)
-
Когда администратор добавляет пользователя, ему нужно только один раз ввести пароль, и он должен быть проверен (NOT WORKIG)
-
Когда администратор редактирует пользователя, а поле пароля пуста, оно не должно обновлять пароль, если они что-то печатают, он должен быть проверен. (ЧАСТИЧНАЯ РАБОТА)
validates :password, :presence => true,
:confirmation => true,
:length => {:within => 6..40},
:unless => :force_submit
Единственные случаи, которые я не могу описать, - это когда администратор добавляет пользователя, он не проверяется и когда администратор редактирует пользователя (и вводит пароль), он не проверяется.
:force_submit
передается из формы администратора, поэтому пароль не проверяется. (Так что в случае обновления пустого пароля работает)
Любые идеи/магия?
Ответы
Ответ 1
Ниже, как мне кажется, соответствуют мои требования... Я на самом деле сейчас требую подтверждения для всех пользователей. (Это делает вид чище). Но при обновлении я допускаю пробелы.
validates :password, :presence => true,
:confirmation => true,
:length => {:within => 6..40},
:on => :create
validates :password, :confirmation => true,
:length => {:within => 6..40},
:allow_blank => true,
:on => :update
Ответ 2
Строим немного на принятом ответе, здесь код, который я использовал в проекте Rails на работе. (Примечание: мы используем devise
для обработки аутентификации пользователя и devise_invitable
для создания новых пользователей.)
PASSWORD_FORMAT = /\A
(?=.{8,}) # Must contain 8 or more characters
(?=.*\d) # Must contain a digit
(?=.*[a-z]) # Must contain a lower case character
(?=.*[A-Z]) # Must contain an upper case character
(?=.*[[:^alnum:]]) # Must contain a symbol
/x
validates :password,
presence: true,
length: { in: Devise.password_length },
format: { with: PASSWORD_FORMAT },
confirmation: true,
on: :create
validates :password,
allow_nil: true,
length: { in: Devise.password_length },
format: { with: PASSWORD_FORMAT },
confirmation: true,
on: :update
Ответ 3
это работает для пустого пароля при обновлении:
validates :password, :presence => true, :on => :update,
:if => lambda{ !password.nil? }
validates :password,
:confirmation => true,
:length => { :minimum => 6},
:if => lambda{ new_record? || !password.nil? }
Ответ 4
еще один вариант
validates_presence_of :password_digest
validates_length_of :password, minimum: 6, if: Proc.new { |user| user.password.present? }