0

我正在尝试使用validation_presence_of创建一个特殊的验证案例,如下所示:

    class Foo
       attr_accessor :a, :b

       include ActiveModel::Validations
       validates_presence_of :a, :unless => Proc.new{ |b| not b.nil? }
       validates_presence_of :b, :unless => Proc.new{ |a| not a.nil? }
    end

在下面的代码中,我想说 validate aunlessb已经验证,并且 validate bunlessa已经验证。所以如果a已经定义,我可以b留空,如果b已经定义,那么我可以a留空。但是,如果两者都被定义,那么这也是一个有效的答案。我只是不知道为什么我的代码不起作用。我是新手,我真的不明白我哪里出错了。

4

2 回答 2

1

正如@Tumas 所建议的,Foo 的实例被传递给一个实例块。在这种情况下,您也可以编写自定义验证,而不是编写这样的条件,因为这会让您更贴切。错误。

class Foo
   attr_accessor :a, :b

   include ActiveModel::Validations
   validates :atleast_a_or_b_present
   def atleast_a_or_b_present
      errors.add_to_base("You must provide either a or b") if a.blank? and b.blank?  
   end

end

为什么我建议自定义验证:

a) 考虑a两者b都缺失的情况。您的方法会给用户 : 带来错误a cannot be blank,而这个会给出You must provide either a or b,我猜第二个会更好地代表这种情况。

b)在我看来,与两个领域有关的验证包括到基础。

c)最重要的恕我直言atleast_a_or_b_present更具可读性。

于 2013-10-26T23:47:25.267 回答
0

它不起作用,因为 Foo 的一个实例被传递给了一个除非块,而不仅仅是一个属性。这有效:

   class Foo
       attr_accessor :a, :b

       include ActiveModel::Validations
       validates_presence_of :a, :unless => Proc.new{ |o| not o.b.nil? }
       validates_presence_of :b, :unless => Proc.new{ |o| not o.a.nil? }
    end
于 2013-10-26T23:22:44.727 回答