2012-01-13 61 views
16

我是很新,Rails和我現在整個這我不能和我的朋友谷歌:)Rails - 如何驗證一個字段只有當另一個字段有一定的值?

在我的形式解決我有三個值中選擇一個問題就來了:蘋果香蕉櫻桃。如果我從select中選擇Apple我隱藏了另一個Select-和帶有一些Javascript的文本字段,因爲當選擇Apple時,不需要再填寫這兩個字段。

所以,現在我有一個驗證我的表單時提交的問題。 我發現一些類似的問題,例如在 的情況下「只驗證一個字段,如果另一個爲空。」

這個問題已經解決這樣的:

validates_presence_of :mobile_number, :unless => :home_phone? 

所以我只是試着它突然出現在我的腦海裏的第一件事:

validates_presence_of :state, :granted_at, :if => :type != 1 

但是當我運行它,我得到這個錯誤:

undefined method `validate' for true:TrueClass 

所以現在我也沒弄明白怎麼可以從中創建對象訪問值... 預先感謝您的幫助,我希望我的問題並不像聽起來那麼明顯:-)

回答

27

因爲它是你需要將它包裝在一個lambda或者一個Proc對象,像這樣的可執行代碼:

validates_presence_of :state, :granted_at, :if => lambda { |o| o.type != 1 } 

# alternatively: 
..., :if => lambda { self.type != 1 } 
..., :if => Proc.new { |o| o.type != 1 } 
..., :if ->(o) { o.type != 1 } 
+0

謝謝你爲快速響應:)但什麼包含這個塊變量「o」?正在驗證的對象? – TehQuila 2012-01-13 13:07:59

+0

是的,確切地說。也可以看看@ Hauleth的答案,您可以在其中找到解決問題的其他方法。權威性參考可以在Rails API文檔中找到:http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html希望有所幫助。此外,我建議你谷歌「紅寶石procs和塊」瞭解這背後的基本(紅寶石)積木。希望有所幫助。 – Matt 2012-01-13 19:17:21

21

您可以使用if標誌和lambda:

validates_presence_of :state, :granted_at, :if => lambda {self.type != 1} 

或者只是創建私有方法:

validates_presence_of :state, :granted_at, :if => :valid_type? 

private 
def valid_type? 
    type != 1 
end 
1

雖然上面提到的方式是最好的做法,但你也可以把它簡單的是這樣的:

validates_presence_of :state, :granted_at, :if => "type!=1" 
1

建立在以前的答案,你也可以用更短的「箭頭」語法

validates :state, :granted_at, presence: true, if: ->(o) { o.type != 1 } 
相關問題