使用`Hash`使用`class_attribute`的正确方法

时间:2015-01-20 09:08:32

标签: ruby-on-rails mutable class-variables

Rails有一个名为class_attribute的类扩展,它允许继承类实例变量。这适用于不可变对象,例如, String,但没有变数:

class Base
  class_attribute :options
  self.options = {}
end

class SubClass < Base
end

Base.options                   # {}
SubClass.options[:foo] = "bar" # { foo: "bar" }
Base.options                   # { foo: "bar" }

问题是如何让子类拥有自己的options副本而不在其体内明确初始化它:

class SubClass < Base
  self.options = {}
end

1 个答案:

答案 0 :(得分:3)

诀窍是在父类中使用inherited方法:

class Base
  class_attribute :options
  self.options = {}

  class << self
    def inherited(subClass)
      subClass.options = self.options.clone
    end
  end
end

这将在每次子类化时自动克隆父选项。