2014-09-04 86 views
1

以下模塊:獲取從類類變量直接

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.mailer,def self.router,def self.sms_gateway獲得者 - 每個部分一個。如果出現新的部分,則必須定義新的吸氣劑。如何避免這種情況,而不必調用EnvParams.environment.mailer.password這樣的中間吸氣劑?

回答

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的作品。

+0

太棒了!這裏有一些提升:如果@@ env'不包含請求的名字,則拋出'NoMethodError'異常。 – Paul 2014-09-05 07:02:03