2011-03-01 95 views
3

我正试图实现功能,其中一旦设置属性就无法在ActiveRecord模型上进行更改。为此,我写了以下方法:在ActiveRecord中标记无效属性

def address 
self[:address] 
end 

def address=(val) 
if new_record? 
    self[:address] = val 
else 
    errors.add(:address, "Cannot change address, once it is set") 
    return false # tried return nil here first, did not work 
end 
end 

我在这里做错了什么吗?我想要的对象是无效的,一旦我尝试更改地址,但我没有得到任何错误,当我这样做obj.valid?

编辑:一旦设置它的值不会更改,但我想获得无效的对象当我通过obj.valid进行验证时?

回答

8

当您执行obj.valid?时,它将清除所有错误,然后依次运行每个验证。为了在验证时产生错误,您必须将该逻辑移入验证块。

这里的一种方式为例做与一个实例变量:

def address=(val) 
    if new_record? 
    self[:address] = val 
    else 
    @addr_change = true 
    return false # tried return nil here first, did not work 
    end 
end 

validate do |user| 
    errors.add(:address, "Cannot change address, once it is set") if @addr_change 
end 
+0

咄!我应该想到这一点。谢谢! – rmk 2011-03-01 20:08:10

+0

没问题。我为后代添加了一个代码示例,以防其他人来问相同的问题。 :-) – Benson 2011-03-01 20:26:43

+0

谢谢谢谢谢谢!这是我为我的遗留项目寻找好几个小时。 – rendon 2015-01-31 20:43:48