如何保护Rails模型属性?

gsm*_*oza 12 ruby model ruby-on-rails

我的发票模型有一个address_id属性,我不希望这个address_id更改为FOREVER.所以我不希望这发生在课外:

invoice.address_id = 1
invoice.address = some_address
Run Code Online (Sandbox Code Playgroud)

Rails会自动将此address_id属性从发票表添加到模型中,那么如何将此属性声明为private/protected?调用

attr_protected :address_id
Run Code Online (Sandbox Code Playgroud)

很可能不是解决方案,因为根据文档它只能防止大规模分配.

谢谢!

Ian*_*ell 21

你想要的attr_readonly.


ryw*_*ryw 5

不像单行代码那么漂亮,但是下面的代码应该可以工作(并且您总是可以进行一些元编程来编写“不可变”方法)

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