Rails 4中属性的私有/受保护访问器

时间:2013-07-31 15:38:56

标签: ruby-on-rails ruby-on-rails-4 encapsulation

说我有以下课程:

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无关,但这也是一个安全问题。

有没有办法设置私有属性?

2 个答案:

答案 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的属性将用于创建新记录,但更新操作将忽略这些字段。”