【问题标题】:Rails validation that one value does not equal anotherRails 验证一个值不等于另一个值
【发布时间】:2012-02-23 19:50:09
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您可以添加自定义验证:

    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')
    

    【讨论】:

      【解决方案2】:

      在您的模型中:

      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
      

      【讨论】:

        【解决方案3】:

        更多乐趣:

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

        虽然这当然不是非常可读,但它很优雅 - 我们利用 proc 的排除验证来防止值相等。有些人可能更喜欢更冗长的方法,但我喜欢简洁——不存在的代码不能有错误。另外,这将在默认的 rails 位置获得错误消息,这对于 i18n 的目的可能很方便。

        (更好?)

        【讨论】:

        • 本网站上通常不赞成仅使用代码的答案。您能否编辑您的答案以包含一些 cmets 或对您的代码的解释?解释应回答以下问题:它有什么作用?它是如何做到的?它去哪儿了?它如何解决OP的问题?请参阅:How to anwser。谢谢!
        猜你喜欢
        • 1970-01-01
        • 2015-12-03
        • 2012-05-26
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多