5

On Rails的5導軌 - 驗證:如果一個條件爲真

我有一個Order模型與description屬性。如果滿足以下兩個條件之一,我只想驗證它的存在:如果當前步驟等於第一步或者如果require_validation等於true。

我可以很容易地驗證基於一個條件是這樣的:

validates :description, presence: true, if: :first_step? 

def first_step? 
current_step == steps.first 
end 

,但我不知道如何去增加一個條件,如果驗證一個或另一個是真實的。

類似:

validates :description, presence: true, if: :first_step? || :require_validation 

謝謝!

回答

7

您可以使用lambda爲if:條款,做一個或條件。

validates :description, presence: true, if: -> {current_step == steps.first || require_validation} 
3

你可以用一種方法包裝它嗎?根據docs

:如果 - 指定的方法,PROC或字符串來調用,以確定是否應當發生對所述驗證(例如,如果:allow_validation,或者如果:Proc.new {|用戶| user.signup_step> 2})。該方法,proc或字符串應返回或評估爲真或假的值。

validates :description, presence: true, if: :some_validation_check 

def some_validation_check 
    first_step? || require_validation 
end 
1

如果你不希望添加一個方法,賈裏德說,那麼你可以嘗試使用拉姆達

validates :description, presence: true, if: ->{ first_step? || require_validation } 
2

你可以傳遞一個lambda被評爲if條件。

嘗試

validates :description, presence: true, if: -> { first_step? || require_validation }

+1

是不是一個拉姆達?一個塊可以是:'validates:description,presence:true,if:{first_step? || require_validation}' –

+0

啊,你說得對。我應該說「你可以傳遞一個lambda」。 –

+0

:)一個塊也可以工作。在使用它之前,Rails將它轉換爲proc或lambda(我忘了它是什麼)。 –