我写了一个与amazon-ecs gem进行交互的类,如下所示:
# app/models/aws.rb
require "amazon/ecs"
class Aws
# various methods such as...
def lookup(item_id, options = { :id_type => "ean" # etc... })
Amazon::Ecs.item_lookup(item_id, options)
end
end
现在我怀疑我实施这个方法有点臭,所以我有一些菜鸟问题......
一个班级不是最好的办法吗?我觉得我必须做的事情没有意义
aws = Aws.new
aws.lookup(an_item_id)
每当我想访问类的方法时。我应该使用模块吗?我该怎么做?
答案 0 :(得分:4)
justinxreese已经为您解答了这个问题 - 只需在您的Gemfile中加入gem 'amazon/ecs'
行并运行bundle install
。
我不知道这是否是常见做法,但我会避免尝试混合Amazon::Ecs
。我认为这个前缀可以帮助读者轻松区分你的代码和什么是Ecs代码。
在这种情况下,一个类很好,但不是将每个方法定义为实例方法,而是改为使用类方法。
示例:
def self.lookup(item_id, options = { :id_type => "ean" # etc... })
Amazon::Ecs.item_lookup(item_id, options)
end
或强>
def Aws.lookup(item_id, options = { :id_type => "ean" # etc... })
Amazon::Ecs.item_lookup(item_id, options)
end
无论你喜欢什么。
现在您可以在不实例化新的Aws对象的情况下调用此方法:
Aws.lookup(an_item_id)
答案 1 :(得分:0)
如果您的代码中需要其功能,则需要宝石。
您只能包含一个模块,但Amazon::Ecs
为a class。相反,你可以这样做:
def lookup( ... )
Amazon::Ecs.instance_eval do
item_lookup( ... )
end
end
然而,这实际上比你所拥有的东西更臭。如果你真的想弄乱你的命名空间而只是使用include Amazon
,你可以Ecs.item_lookup
。但是,我会做的是:
E = Amazon::Ecs
def lookup( ... )
E.item_lookup( ... )
end
如果您只需要命名空间方法,并且没有为不同实例保留任何状态或设置,请使用模块:
module Aws
E = Amazon::Ecs
def self.lookup( ... )
E.item_lookup
end
end
Aws.lookup( ... )