如何保护Rails模型属性?

时间:2020-03-06 14:45:47  来源:igfitidea点击:

我的帐单模型具有address_id属性,但我不希望此address_id永远更改。所以我不希望这种情况在课外发生:

invoice.address_id = 1
invoice.address = some_address

Rails会自动从发票表中将此address_id属性添加到模型中,那么如何将该属性声明为私有/受保护?呼唤

attr_protected :address_id

最有可能不是解决方案,因为根据文档,它只能阻止批量分配。

谢谢!

解决方案

不像一个衬里那么漂亮,但是下面的代码应该可以工作(而且我们总是可以做一些元编程来编写"不变"方法)

def address_id=(id)
  if new_record?
    write_attribute(:address_id, id)
  else
    raise 'address is immutable!'
  end
end

我们需要attr_readonly