Подтвердить что ты не робот

Проверка пароля Ruby on Rails

Итак, у меня есть интересные требования к проверке пароля:

  • Когда пользователь подписывается, я хочу, чтобы они вводили пароль и подтверждали и находились между 6..40 (ПОЛУЧИТЕ ЭТУ РАБОТУ 100%)

  • Когда пользователь обновляет свой профиль, применяются те же правила валидации (ПОЛУЧИТЕ ЭТУ РАБОТУ 100%)

  • Когда администратор добавляет пользователя, ему нужно только один раз ввести пароль, и он должен быть проверен (NOT WORKIG)

  • Когда администратор редактирует пользователя, а поле пароля пуста, оно не должно обновлять пароль, если они что-то печатают, он должен быть проверен. (ЧАСТИЧНАЯ РАБОТА)

    validates :password, :presence => true,
                       :confirmation => true,
                       :length => {:within => 6..40},
                       :unless => :force_submit
    

Единственные случаи, которые я не могу описать, - это когда администратор добавляет пользователя, он не проверяется и когда администратор редактирует пользователя (и вводит пароль), он не проверяется.

:force_submit передается из формы администратора, поэтому пароль не проверяется. (Так что в случае обновления пустого пароля работает)

Любые идеи/магия?

4b9b3361

Ответ 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? }