2009-12-21 72 views
0

當試圖將模型中的一個列值設置爲零時,Rail的ActiveRecord是否有任何特殊規則?Rails - 將模型值設置爲零

方法freez的健全性檢查總是失敗。

型號:項目

柱:non_project_costs_value(可爲空十進制場)

def froz? 
    return !(non_project_costs_value.nil?) 
end 


def freez(val) 
    raise 'Already frozen, cannot freeze ... the value is ' + non_project_costs_value.to_s if froz? 
    non_project_costs_value = val 
    save 
    raise 'Sanity check. After freezing the thing should be frozen!' if !froz? 
end 
+0

你在哪裏「的設定值爲零?你在打電話嗎?@project.freez(nil)? – MattMcKnight 2009-12-21 04:52:59

回答

2

你有一個錯誤在你FREEZ方法

non_project_costs_value = val # this is setting a local variable 
           # (in the method freez) to val 

# change to: 
self.non_project_costs_value = val # this will set the record's attribute 
            # (the column) to val 
            # It will be saved to the dbms once you save 
+0

這是否意味着我的froz中還有一個bug?方法?在那裏我使用non_project_costs_value而不是self.non_project_costs_value – Daniel 2009-12-21 05:06:59

+0

沒有。原因是你的froz?方法中沒有名爲non_project_costs_value的本地變量,所以Ruby尋找一個non_project_costs_value方法,它找不到一個,但是ActiveRecord機器覆蓋「找不到方法」函數,注意到方法想要的(non_project_costs_value)是一個屬性,然後提供值。但是,如果您將non_project_costs_value定義爲局部變量(通過分配給它),然後再引用non_project_costs_value相同的名稱範圍)將使用本地var。文檔討論這個,但我現在找不到一個好的參考。 – 2009-12-21 05:14:03