3

我正在尝试实现功能,其中一旦设置属性,就无法在 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 进行验证时,我想获得无效对象?

4

1 回答 1

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
于 2011-03-01T20:00:56.177 回答