我可以用Simple Form gem中的类实例变量替换类变量吗?

时间:2014-02-17 09:37:20

标签: ruby-on-rails ruby simple-form instance-variables class-variables

出于样式方面的原因,我想避免使用类变量,并希望用类实例变量替换它们。如果我有:

module SimpleForm
  mattr_accessor :input_error_class
  @@input_error_class = 'error-field'
  ...
end

我将其更改为:

module SimpleForm
  @input_error_class = 'error-field'
  class << self
    attr_accessor :input_error_class
  end
  ...
end

这会打破简单形式吗?

2 个答案:

答案 0 :(得分:3)

如果有一个类是共享SimpleForm的{​​{1}}的子类或超类,那么通过将类变量更改为类实例变量,该变量将不会被子共享/ superclass,这可能会破坏代码。此外,如果存在使用类变量的实例方法,则可能会破坏代码。否则,它不会破裂。

答案 1 :(得分:1)

我会说它应该可以工作,但实际上并没有作为类变量。在这种情况下,类变量更容易查看。 :)

由于没有生成实例,因此不会获得线程安全性。通过这种设计,您既不能在运行时更改行为,因为在Rails加载后变量是相当静态的。

除了类变量之外,另一种做法是使用ActiveSupport::Configuration模块生成配置,或者在没有此模块的情况下手动创建此类。但是在Rails加载后,配置仍然非常静态。

我的建议是,如果您需要在项目中全局更改,请检查是否有配置。

如果您想在运行时自由更改它,最好查看其他API而不是配置部分。