以下模块:
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
获取者 - 每个部分一个。如果出现新部分,则必须定义新的getter。如何避免这种情况而不必调用像EnvParams.environment.mailer.password
这样的中间吸气剂?
答案 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