Rails attr_readonly不起作用

根据这个问题和attr_readonly的文档 ,应该可以:

 class MyModel < ActiveRecord::Base attr_accessible :foo attr_readonly :bar end m = MyModel.create(foo: '123', bar: 'bar') # Should work m.update_attributes(bar: 'baz') # Should not work 

然而,第一个失败,说我不能大规模分配bar 。 我在做什么?

从文档

attr_accessible采用可访问的属性列表。 所有其他属性都将受到保护

因此attr_accessible使bar属性不受大规模分配的影响。

您可以将该属性设为密钥: –

 attr_accessible :key 

然后再添加一个validation

 validate :check_if_key_changed, :on=> :update private def check_if_key_changed if self.key_changed? errors.add(:key,"cant change key") end end 

通过这种方式,您可以在创建时对其进行一次分配,也可以确保不会更新。