避免在一组方法的开头使用相同的代码

时间:2011-05-20 10:43:19

标签: ruby-on-rails ruby

问题: 我使用全局常量STORE_DATA_ENABLED来启用我写的模块(StoreData): 例如:

STORE_DATA_ENABLED = false

...

module StoreData

    def a
        return unless STORE_DATA_ENABLED
        ...
    end

    def b
        return unless STORE_DATA_ENABLED
        ...
    end

    def c
        return unless STORE_DATA_ENABLED
        ...
    end

    ...

end

我认为有一种方法可以在不检查模块中的所有方法的情况下禁用模块。 干这个代码的想法吗?

1 个答案:

答案 0 :(得分:1)

使用before_filter。在模块中的每个方法调用之前调用它:

module StoreData

  before_filter :store_data_enabled

  def a
    ...
  end

  private
    def store_data_enabled
      STORE_DATA_ENABLED # return implicit true/false
    end
end

编辑:仅用于红宝石的方法。这使用模块初始值设定项重新创建模块中的所有公共方法,并使它们返回nil。当你的方法中有参数时,我没有尝试这种行为。

module M  

  # this is called while module init
  def self.included(base)
    unless STORE_DATA_ENABLED
      # iterate over public methods of this instance
      public_instance_methods.each do |m|
        # overwrite all methods, does not care about arguments
        define_method(m) { return nil }
      end
    end
  end

  def a
    ...
  end 

end