2013-10-26 123 views
0

我試圖用validation_presence_of創建一個特殊的驗證的情況下,你可以看到如下:Ruby on Rails的: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 

在下面的代碼我想它說的驗證a除非b已經驗證,並驗證b,除非a已被驗證。因此,如果a已經定義,我可以將b留空,如果b已經定義,那麼我可以將a留空。但是,如果兩者都定義,那麼這也是一個有效的答案。我只是不知道爲什麼我的代碼無法正常工作。我是新來的,並不真正明白我的錯在哪裏。

回答

1

至於建議由富的@Tumas實例傳遞到實例塊。 你也可以在這種情況下編寫自定義驗證,而不是像這樣寫條件語句,因爲這會讓你更加貼切。錯誤。

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)考慮的情況下當兩個ab都不見了。你的方法會給用戶帶來錯誤:a cannot be blank,而這個將給You must provide either a or b,我想第二個代表情況更好。

b)在我看來,有關兩個領域的驗證包括基地。

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

0

它不工作,因爲Foo的一個實例被傳遞給一個unless塊,而不僅僅是一個屬性。這工作:

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