2013-05-08 63 views
0

當我使用Shoulda的validates_presence_of時,它在一個before_validation回調函數上失敗。RSpec Shoulda validates_presence_of nilClass

before_validation :set_document, :set_product, :set_price 

我試圖讓這個規範來傳遞:

it { should validate_presence_of(:quantity).with_message("Please a quantity.") } 

我有一個行項目的數量,UNIT_PRICE,TAX_RATE和價格的0數據庫的默認值。在訂單項驗證之前,我會根據其他屬性計算價格發生變化時的價格。

我得到這個錯誤,而類似的錯誤,對所有參與這個計算的屬性:

3) LineItem 
    Failure/Error: it { should validate_presence_of(:quantity).with_message("Please a quantity.") } 
    NoMethodError: 
    undefined method `*' for nil:NilClass 
    # ./app/models/line_item.rb:153:in `total_price' 
    # ./app/models/line_item.rb:223:in `set_price' 
    # ./spec/models/line_item_spec.rb:32:in `block (2 levels) in <top (required)>' 

我的回調,set_price,是非常簡單的:

def set_price 
    self.price = total_price 
end 

而且TOTAL_PRICE方法也很簡單:

def total_price 
    quantity * unit_price * (1 + tax_rate/100) 
end 

我很感激任何幫助,因爲我'米完全難倒了。我確實看到一些人發佈關於自定義驗證方法的信息這似乎很基礎,我不知道如何繼續。

+0

什麼是'unit_price'?這可能是'nil' – ck3g 2013-05-08 07:55:19

+1

unit_price的數據庫默認值爲0,稅率,數量和價格也一樣。 – 2013-05-08 08:42:05

+0

因此,嘗試將這兩個字段的日誌值設爲'nil'。和/或嘗試使用'self.quantity'和'self.unit_price' – ck3g 2013-05-08 09:33:22

回答

0

由於total_price運行之前驗證,quantity可以nil在執行回調的時間。這實際上是Shoulda匹配器運行時幕後發生的情況,這就是爲什麼你會得到一個錯誤。它試圖將*方法發送到quantity,即nil

改爲使用after_validationbefore_save

相關問題