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

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

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+\-.]+@[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

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

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

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

Ответы [ 2 ]

21 голосов
/ 18 марта 2012

Вы можете добавить условное :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
0 голосов
/ 17 апреля 2018

В дополнение к ответу Заббы вариант 1 также может быть записан так:

with_options if: :password_provided? do
    validates :password, :password_confirmation, presence: true, length: { minimum: 12 }
end

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