说我有以下课程:
class Foo < ActiveRecord::Base
belongs_to :bar
end
在rails控制台中,我可以这样做:
foo = Foo.new
foo.bar_id = 3
但这可能违反了封装原则。我认为这是更好的主意:
foo = Foo.new
foo.bar = Bar.find(3);
bar_id
应该是私有/受保护的。
这与mass assignment
和strong parameters
无关,但这也是一个安全问题。
有没有办法设置私有属性?
答案 0 :(得分:0)
Is there a way to make Rails ActiveRecord attributes private?
class MyModel < ActiveRecord::Base
private
def my_private_attribute
self[:my_private_attribute]
end
def my_private_attribute=(val)
write_attribute :my_private_attribute, val
end
end
答案 1 :(得分:0)
我不认为只是将写入访问器设为私有或受保护将可靠地阻止通过update_attribute
或批量分配进行更改。
虽然它本身并不是“私人”,但你可以通过设置read_only属性来获得所需的效果,例如
attr_readonly :bar_id
如果您确实需要更新“私有”值,请将其作为@bar_id访问。根据文档,“列为readonly的属性将用于创建新记录,但更新操作将忽略这些字段。”