Как отключить проверку пароля/подтверждения при использовании has_secure_password в Rails 3.2? - программирование
Подтвердить что ты не робот

Как отключить проверку пароля/подтверждения при использовании has_secure_password в Rails 3.2?

У меня есть пользовательская модель, настроенная как таковая:

class User < ActiveRecord::Base
  has_secure_password

  # callbacks -------------------------------------------------------------------------
  before_create { generate_token(:auth_token) }

  # setup accessible (or protected) attributes for your model and validation ----------
  attr_accessible :email, :password, :password_confirmation

  # validations
  VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i
  validates :email    , presence: true,
                        uniqueness: { case_sensitive: false },
                        format: { with: VALID_EMAIL_REGEX }

  validates :password             , length: { minimum: 6 } 

  validates :password_confirmation, presence: true

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

Итак, если пользователь обновляет свою информацию в форме без указания пароля и/или подтверждения, он должен быть успешным. Если пользователь обновляет свою информацию и включает в себя пароль и/или подтверждение, проверки должны выполняться.

Каков наилучший способ для этого?

4b9b3361

Ответ 1

Вы можете добавить условный :if для обоих валидаторов:

Вариант 1:

validates :password             , length: { minimum: 6 }, :if => :validate_password?
validates :password_confirmation, presence: true        , :if => :validate_password?

def validate_password?
  password.present? || password_confirmation.present?
end

Вариант 2:

Или используйте метод проверки, перемещая проверки проверки в метод вместо отдельных вызовов validates:

validate :check_password, :on => :update

def check_password
  return unless password.present? || password_confirmation.present?
  ..validations for both attributes here.. 
  ..check presence, length etc. as required and add to the errors variable as necessary..
end