0

假设我有以下课程:

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 assignmentstrong parameters它也是一个安全问题。

有没有办法将某些属性设置为私有?

4

2 回答 2

0

我认为仅仅将写访问器设为私有或受保护不会可靠地防止通过update_attribute或批量分配进行更改。

虽然它本身实际上并不是“私有的”,但您可以通过设置属性 read_only 来获得所需的效果,例如

attr_readonly :bar_id

如果您确实需要更新值“private-ly”,请以@bar_id 访问它。根据文档,“列为只读的属性将用于创建新记录,但更新操作将忽略这些字段。”

于 2014-07-17T16:40:12.850 回答
0

有没有办法将 Rails ActiveRecord 属性设为私有?

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
于 2013-10-07T16:35:35.403 回答