在我的模型 package.rb
validates_presence_of :duration, :unless => :expiration_date?
validates_presence_of :expiration_date, :unless => :duration?
我只想输入其中一项。其他字段必须设置为零。只有其中一个需要有价值。但我仍然可以创建一个包含这两个字段的包。可能是其他我遗漏了什么或者我需要使用其他方法吗?这不是正确的做法吗?
在我的模型 package.rb
validates_presence_of :duration, :unless => :expiration_date?
validates_presence_of :expiration_date, :unless => :duration?
我只想输入其中一项。其他字段必须设置为零。只有其中一个需要有价值。但我仍然可以创建一个包含这两个字段的包。可能是其他我遗漏了什么或者我需要使用其他方法吗?这不是正确的做法吗?
尝试创建自定义验证。
validate :expiration
def expiration
unless duration or expiration_date
errors.add_to_base "Need a way to determine expiration"
end
end
快速而肮脏的解决方案:
require 'active_model'
class Person
include ActiveModel::Validations
attr_accessor :aa, :bb
validate :only_one_present
def initialize(options = {})
self.aa = options[:aa]
self.bb = options[:bb]
end
private
def only_one_present
if both_present || no_attr_present
errors.add(:base, 'Invalid!')
end
end
def both_present
!aa.nil? && !aa.empty? && !bb.nil? && !bb.empty?
end
def no_attr_present
(aa.nil? || aa.empty?) && (bb.nil? || bb.empty?)
end
end
puts Person.new(aa: 'asad', bb: 'sdsd').valid? # => false
puts Person.new(aa: nil, bb: 'sdsd').valid? # => true
puts Person.new(aa: 'asad', bb: nil).valid? # => true
puts Person.new(aa: nil, bb: nil).valid? # => false
当然,您必须先编写正确的规范,然后可以为此提取验证器类。
编辑:
如果使用 ActiveSupport ,您可以更改nil?
和empty?
组合。present?
blank?