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