Rails, как вызывать пользовательский метод проверки только при наличии атрибута при обновлении - PullRequest
0 голосов
/ 30 января 2019

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

validates :mobile_number, presence: {
  message: 'Please provide your phone number.'
}, if: -> (user) { user.new_record? || !user.mobile_number.blank? }

Приведенный выше код работает и будет проверять только наличие мобильногономер в новой записи или если номер мобильного телефона пуст при вызове model.update (и т. д.).

validate :mobile_number_is_unique, if: -> (user) { user.new_record? || !user.mobile_number.blank? }

Приведенный выше код не работает и будет проверять уникальность номера мобильного телефона в новой записи ивсякий раз, когда вызывается model.update (и т. д.).Есть ли способ применить ту же логику к методу проверки, чтобы он не вызывался, когда номер мобильного телефона пуст, когда вызывается model.update (и т. Д.)?

mobile_number_is_unique метод для дальнейшего контекста,

# Determines if the mobile number is unique.
def mobile_number_is_unique
  return errors.add(
    :mobile_number, 'Sorry, an account with that phone number already exists.'
  ) unless User.find_by(
    mobile_number: PhonyRails.normalize_number(mobile_number)
  ).nil?
end

ОБНОВЛЕНИЕ

Самый простой способ выполнить:

validates :mobile_number, presence: {
  message: 'Please provide your phone number.'
}, phony_plausible: {
  message: 'Sorry, phone number format not recognized.'
}, uniqueness: {
  message: 'Sorry, an account with that phone number already exists.'
}, if: -> (user) { user.new_record? || !user.mobile_number.blank? }

Использование метода validate: mobile_number_is_unique включил номер мобильного телефона в текущую модель и потребовался для его исключениячтобы пройти.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

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

validate :mobile_number_is_unique


# Determines if the mobile number is unique.
def mobile_number_is_unique
  return unless mobile_number.present?
  errors.add(
    :mobile_number, 'Sorry, an account with that phone number already exists.'
  ) unless User.find_by(
    mobile_number: PhonyRails.normalize_number(mobile_number)
  ).nil?
end
0 голосов
/ 30 января 2019

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

validates :mobile_number, uniqueness: true

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

validate :mobile_number_is_unique

# Determines if the mobile number is unique.
def mobile_number_is_unique
  if new_record? || !mobile_number.blank?
    return errors.add(
      :mobile_number, 'Sorry, an account with that phone number already exists.'
    ) unless User.where(mobile_number: PhonyRails.normalize_number(mobile_number)).where.not(id: id).count == 0
  end
end

Старая версия

Да, вы можете просто переместить оператор if в метод mobile_number_is_unique.

Таким образом, это станет следующим:

validate :mobile_number_is_unique

# Determines if the mobile number is unique.
def mobile_number_is_unique
  if new_record? || !mobile_number.blank?
    return errors.add(
      :mobile_number, 'Sorry, an account with that phone number already exists.'
    ) unless User.find_by(
      mobile_number: PhonyRails.normalize_number(mobile_number)
    ).nil?
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...