Rails 5:添加条件自定义验证

Dav*_* B. 2 ruby validation activerecord ruby-on-rails ruby-on-rails-5

我想向模型添加条件自定义验证

Rails允许创建方法以创建自定义验证

class Invoice < ApplicationRecord
  validate :expiration_date_cannot_be_in_the_past

  def expiration_date_cannot_be_in_the_past
    if expiration_date.present? && expiration_date < Date.today
      errors.add(:expiration_date, "can't be in the past")
  end
end
Run Code Online (Sandbox Code Playgroud)

它还允许创建条件验证

class Order < ApplicationRecord
  validates :card_number, presence: true, if: :paid_with_card?

  def paid_with_card?
    payment_type == "card"
  end
end
Run Code Online (Sandbox Code Playgroud)

如何混合两者?

我的猜测是

validate :condition, if: :other_condition
Run Code Online (Sandbox Code Playgroud)

但这会创建一个SyntaxError:

syntax error, unexpected end-of-input, expecting keyword_end
Run Code Online (Sandbox Code Playgroud)

And*_*eko 5

当您将缺少的关闭项修复为end在中打开ifexpiration_date_cannot_be_in_the_past,可以进行以下工作:

validate :expiration_date_cannot_be_in_the_past, if: :paid_with_card?
Run Code Online (Sandbox Code Playgroud)