Rails验证一个值不等于另一个值

时间:2012-02-23 19:50:09

标签: ruby-on-rails ruby-on-rails-3 validation

在保存记录之前,有没有办法验证一个text_field不等于另一个?我有两个带有整数的text_fields,它们不能完全相同,以使记录有效。

3 个答案:

答案 0 :(得分:9)

您可以添加自定义验证:

class Something
  validate :fields_a_and_b_are_different

  def fields_a_and_b_are_different
    if self.a == self.b
      errors.add(:a, 'must be different to b')
      errors.add(:b, 'must be different to a')
    end
  end

每次验证对象时(无论是显式验证还是使用验证进行保存)都会调用它,并且会向两个字段添加错误。您可能希望两个字段都出错,以便在表单中以不同方式呈现它们。

否则你只能添加一个基本错误:

errors.add(:base, 'a must be different to b')

答案 1 :(得分:5)

在你的模特中:

validate :text_fields_are_not_equal

def text_fields_are_not_equal
  self.errors.add(:base, 'Text_field1 and text_field2 cannot be equal.') if self.text_field1 == self.text_field2
end

答案 2 :(得分:0)

更多乐趣:

  validates :a, exclusion: { in: ->(thing) { [thing.b] } }

尽管这当然不是很可读,但是很优雅-我们将proc的排除验证与proc结合使用,以防止值相等。某些人可能更喜欢使用更详细的方法,但是我很简洁-不存在的代码不会有bug。另外,这将获得其错误消息的默认导轨位置,这对于i18n而言可能很方便。

(更好?)