2012-07-08 87 views
4

根据this questionattr_readonlydocumentation以下应该是可行的:Rails的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。我在做什么?

回答

3

documentation

attr_accessible需要的属性,这将是访问列表。 所有其他属性将得到保护

因此attr_accessible使得bar属性作为受到质量保护的保护。

+0

我明白了,所以我必须将它添加到两个,'attr_accessible'和'attr_readlony'?反直觉的那种...... – 2012-07-08 12:27:21

+0

不,你要大规模ASIGN它,它不会是一个只读的。你只需要做attr_accessible。 – YuriAlbuquerque 2012-07-08 12:28:37

+6

但是如果我只想在创作时一次性批量分配它? – 2012-07-08 12:30:02

2

您可以进行属性,假设,关键是: -

attr_accessible :key 

,然后再添加一个验证

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 

这样,你就能一次在大众为它分配也可以确保它不会被更新。