Rails如何仅在属性存在于更新时调用自定义验证方法

时间:2019-01-30 05:31:06

标签: ruby-on-rails ruby ruby-on-rails-5

我试图仅在它是新记录或属性存在于更新时才调用自定义验证方法。

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

上面的代码有效,并且只会在调用model.update(etc。)时验证new_record上是否存在手机号码,或者如果手机号码为空。

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

上面的代码不起作用,将在new_record上以及在调用model.update(etc。)时验证手机号码的唯一性。 有没有一种方法可以将相同的逻辑应用于validate方法,以便在调用model.update(etc。)时手机号为空白时不会被调用?

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 :(得分:2)

您仅需要检查验证记录中是否存在手机号码。因此您可以使用以下代码。

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

答案 1 :(得分:1)

您要检查的手机号码是否已经存在,包括您当前正在编辑的用户的手机号码。您应该可以使用:

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