2016-04-01 46 views
0

我有一個模型Rails的傳遞驗證測試

class Vehicule < ActiveRecord::Base 
    before_validation :set_principal, :if =>:new_record? 

    private 
    def set_principal 
     self.principal ||= !!principal 
    end 
end 

如果我測試了一下,當我做Vehicule.new.valid?它總是返回FALSE。爲什麼我必須在函數中添加true才能通過測試?

private 
    def set_principal 
     self.principal ||= !!principal 
     true 
    end 
+0

因爲你沒有通過'principal',那麼它就像'nil'一樣,如果'!! nil => false' – 7urkm3n

+0

所以如果函數返回false,模型的驗證失敗?我只是想把'false'設置爲'principal'屬性。不要讓模型無法創建。如果我想能夠創建'vehicule',我的功能需要返回true?這是正確的方法? –

+1

是'Vehicule.new.valid?'返回'false'模型不會保存。 – 7urkm3n

回答

2

對於初學者來說,失敗的驗證會在您的記錄實例中填充錯誤對象。您可以通過運行model.errors.full_messages來查看錯誤,這對調試總是有用的。

其次,使用present?方法測試值是否存在,而不是使用尷尬的!!方法,該方法在nil上調用時返回false。它會讓你的代碼更加清晰,但它也很有用,因爲它也可以識別「空」對象。換句話說就是"".present? == false[].present? == false{}.present? == falsenil.present? == false等等。還有blank?方法,這與present?的邏輯相反。

最後,在使用:before_validation回調時請注意您的返回值。與其他回調不同,如果函數返回false,它將阻止驗證。

1

因爲不是nil => false。

在IRB:

foo = nil 
!!foo => false 
1

如果您嘗試Vehicule.new(principal: 'WORKS').valid?

def set_principal 
    self.principal ||= !!principal 
end 

它應該通過。