直接从类中获取类变量

时间:2014-09-04 14:14:26

标签: ruby

以下模块:

class EnvParams
  def self.mailer
    environment.mailer
  end

  def self.router
    environment.router
  end

  def self.sms_gateway
    environment.sms_gateway
  end

  private

  def self.environment
    @@env ||= Hashie::Mash.new({data: {
        mailer: {
            address: ENV['DISP_MAILER_SERVER'],
            domain: ENV['DISP_MAILER_DOMAIN'],
            port: ENV['DISP_MAILER_PORT'],
            user_name: ENV['DISP_MAILER_USERNAME'],
            password: ENV['DISP_MAILER_PASSWORD'],
            sender: ENV['DISP_MAILER_SENDER']
        },
        router: {
            url: ENV['GTC_ROUTER_URL']
        },
        sms_gateway: {
            url: ENV['SMS_GATEWAY_URL']
        }
    }}).data
  end
end
已创建

以将所有对环境变量的引用集中在一个文件中,并且打算以这种方式查询环境变量:

EnvParams.mailer.password

我不喜欢的是一堆def self.mailerdef self.routerdef self.sms_gateway获取者 - 每个部分一个。如果出现新部分,则必须定义新的getter。如何避免这种情况而不必调用像EnvParams.environment.mailer.password这样的中间吸气剂?

2 个答案:

答案 0 :(得分:2)

Forwardable是一个更好的解决方案,但要提供另一个选项,您可以动态创建方法:

class A
  def self.method_missing(name, *args, &blk)
    define_singleton_method name.to_sym do 
      environment.send(name.to_sym)
    end 
    self.send(name.to_sym)
  end
end

我从here找到了灵感。这适用于Ruby 1.9。

答案 1 :(得分:1)

您可以使用Forwardable模块(http://www.ruby-doc.org/stdlib-2.0/libdoc/forwardable/rdoc/Forwardable.html

中的委托人
class EnvParams
  extend Forwardable

  def_delegator :environment, :mailer
end