ruby-on-rails - 如果更新时存在属性,Rails 如何仅调用自定义验证方法

标签 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? }

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

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

上面的代码不起作用,并且会在调用 new_record 和调用 model.update(etc.) 时验证手机号码的唯一性。 有没有办法将相同的逻辑应用于验证方法,以便在调用 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 方法将手机号码包含在当前型号上,需要将其排除才能通过。

最佳答案

如果手机号码存在于记录中,您只需要检查验证。所以你可以使用下面的代码。

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

关于ruby-on-rails - 如果更新时存在属性,Rails 如何仅调用自定义验证方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54433851/

相关文章:

javascript - React.createRef 不是 react-rails 中的函数

ruby - ["string"].pack ('H*' ) 是什么意思?

javascript - 管理 Rails 5 的 javascript/coffeescript 代码的有效方法?

ruby-on-rails - 返回从 hstore 中提取的特定值(Postgres + hstore_translate gem)

ruby-on-rails - 在 Heroku 中创建临时文件

ruby-on-rails - 事件管理员 habtm 新按钮文本更改

Ruby:以科学记数法控制打印

ruby-on-rails - 找不到 Rails 5 实体路径助手方法

ruby-on-rails - 根据未过滤的请求参数生成URL

ruby-on-rails - 播种数据时查找 ID