Rails验证两个字段之一(XOR)的存在

Spa*_*nce 1 ruby-on-rails

如何验证是否存在这些值之一,但不能同时存在?

  validates_presence_of :client_id, message: 'Please enter a value'
  validates_presence_of :agency_id, message: 'Please enter a value'
Run Code Online (Sandbox Code Playgroud)

我查看了rails指南,我认为我需要使用条件验证,但仍然有些困难。

dav*_*000 6

尝试这个

validates :client_id, presence: true, unless: :agency_id
validates :agency_id, presence: true, unless: :client_id
Run Code Online (Sandbox Code Playgroud)

如果要包含错误消息,可以执行

validates :client_id, presence: { message: "Must have a value" }, unless: :agency_id
Run Code Online (Sandbox Code Playgroud)

您可以阅读有关验证消息的更多信息


And*_*uge 5

如果你使用unless 语法,你会得到两个错误:一个是client_id,一个是agent_id,如果两者都是Nil。

如果您只想要一个错误,则需要一个自定义方法。 指南:ActiveRecord 验证

validate :client_or_agency

def client_or_agency
  errors.add(:client_id, "Either Client or Agency needs a value") unless client_id.present? || agency_id.present?
end
Run Code Online (Sandbox Code Playgroud)