我试图仅在它是新记录或属性存在于更新时才调用自定义验证方法。
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方法将移动电话号码包含在当前模型中,需要将其排除才能通过。
答案 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