我正在编写一个rails应用程序,它可以调用多个外部Web API,例如Geonnames。我的想法是在单独的模块或类中捕获这个逻辑,并从我的模型和控制器类中调用它们。是否有任何最佳实践可以放置此类代码?它应该是一个单独的非ActiveRecord模型类还是lib文件夹中的模块?或者,在我需要它们的ActiveRecord类中简单地实现WS调用作为静态方法更好吗?
THX
答案 0 :(得分:1)
有几种方法,但通常我坚持以下原则。
/lib
(如果你有很多,你可以创建一个/lib/clients
子目录)GeonamesClient
或GeonamesWrapper
一个例子;
class ClientBase
# maybe we pass in a logger, or something
def initialize(options={})
end
# perhaps a central way to call the api
def call(method_name, *args)
end
end
class GeonamesClient < ClientBase
base_uri "www.geonames.org"
def postal_codes(country)
...
end
end
然后你实例化它,然后调用它。 (可能客户端可能在呼叫之间保持某种状态)
client = GeonamesClient.new(:logger => Address.logger)
client.countries.each do |country|
client.postal_codes(country)
end