Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 强制执行互斥字段';存在于轨道中_Ruby On Rails_Ruby On Rails 3.2 - Fatal编程技术网

Ruby on rails 强制执行互斥字段';存在于轨道中

Ruby on rails 强制执行互斥字段';存在于轨道中,ruby-on-rails,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3.2,此代码不适用于我,但调试器确实会触发,并且这些值是我对测试用例的期望值: validates :a, :presence => false, :if => Proc.new { |f| debugger; f.b.present? } validates :b, :presence => false, :if => Proc.new { |f| debugger; f.a.present? } 目标:a和b不应同时定义 如果我理解语法,a的存在应该是false如果b存在

此代码不适用于我,但调试器确实会触发,并且这些值是我对测试用例的期望值:

validates :a, :presence => false, :if => Proc.new { |f| debugger; f.b.present? }
validates :b, :presence => false, :if => Proc.new { |f| debugger; f.a.present? }
目标:
a
b
不应同时定义

如果我理解语法,
a
的存在应该是
false
如果
b
存在。与
b
类似


我误解了吗?我相信数据是通过
save记录的。。但我已经确认正在调用验证。我在
obj.save之后立即查看了对象
对象错误
有一个空的
消息
散列。

问题不在于“如果”逻辑--
存在:假
存在:真

参考:

我最终使用了:

validates :a, length: {is: 0}, if: Proc.new { |f| f.b.present? }
validates :b, length: {is: 0}, if: Proc.new { |f| f.a.present? }

更简单的方法是调用一个自定义验证,只检查是否存在使用self的验证,而不调用length或创建proc

validate :are_mutually_exclusive

private

def are_mutually_exclusive
  if self.a.present? && self.b.present?
    errors.add(:your_error_key, 'Values for A and B are mutually exclusive')
  end
end
如果您对值进行了分组,则这些值也更易于管理。例如,A和B可以一起使用,但A和B都不能与C一起使用

if (self.a.present? || self.b.present?) && self.c.present?