我想使用这个 api:https ://github.com/coinbase/coinbase-ruby第一步是初始化 API,如下所示:
coinbase = Coinbase::Client.new(ENV['COINBASE_API_KEY'], ENV['COINBASE_API_SECRET'])
我想知道放置此代码的最佳位置是什么,如果我将它放在“那里”,我将如何访问它?我希望这个变量(coinbase)可以在应用程序的任何地方访问。
谢谢!
我想使用这个 api:https ://github.com/coinbase/coinbase-ruby第一步是初始化 API,如下所示:
coinbase = Coinbase::Client.new(ENV['COINBASE_API_KEY'], ENV['COINBASE_API_SECRET'])
我想知道放置此代码的最佳位置是什么,如果我将它放在“那里”,我将如何访问它?我希望这个变量(coinbase)可以在应用程序的任何地方访问。
谢谢!
这个问题的答案真的取决于你的用例和你的方法。然而,我的一般建议是创建一个服务对象(在 DDD 意义上)(请参阅该链接中名为“域对象不应该知道任何关于底层基础设施的信息”部分),它处理与 Coinbase API 的所有通信。然后,在这个服务对象中,你可以简单地初始化 Coinbase::Client 对象一次,无论你调用它多少次。这是一个例子:
# app/services/coinbase_service.rb
class CoinbaseService
cattr_reader :coinbase_client, instance_accessor: false do
Coinbase::Client.new(ENV['COINBASE_API_KEY'], ENV['COINBASE_API_SECRET'])
end
def self.do_something
coinbase_client.do_something_in_their_api
end
def self.do_something_else
coinbase_client.do_something_else_in_their_api
end
end
那么你可能会这样做,例如:
# From MyController#action_1
if CoinbaseService.do_something
# ...
else
# ...
end
或者:
# From MyModel
def do_something
CoinbaseService.do_something_else
end
要使服务对象正常工作,您可能需要app/services
在 application.rb 文件中添加自动加载路径。我通常只是添加这个:
# config/application.rb
config.autoload_paths += %W(#{config.root}/app)
我发现这种服务对象方法在组织上非常有益,更高效(只需要调用新的 Coinbase 客户端 1 次),更容易测试(易于模拟调用Coinbase::Client
),而且很快乐 :)。
使用全局变量的一种方法可以与在 Rails 应用程序中初始化 redis 类似,方法是在config/initializers/coinbase.rb中创建一个初始化程序,其中:
$coinbase = Coinbase::Client.new(ENV['COINBASE_API_KEY'], ENV['COINBASE_API_SECRET'])
现在,您可以访问$coinbase
应用程序中的任何位置!
在文件config/initializers/coinbase.rb
Rails.application.config.after_initialize do
CoinbaseClient = Coinbase::Client.new(
Rails.application.credentials.coinbase[:api_key],
Rails.application.credentials.coinbase[:api_secret])
end
代替加密凭据,您还可以使用环境变量:ENV['COINBASE_API_KEY'], ENV['COINBASE_API_SECRET']
以上将使常量CoinbaseClient
在您的应用程序中随处可用。它还将确保在客户端初始化之前加载所有 gem。
注意:我使用的是 Rails 6.1.4.4 和 Ruby 2.7.5