4

我想使用这个 api:https ://github.com/coinbase/coinbase-ruby第一步是初始化 API,如下所示:

coinbase = Coinbase::Client.new(ENV['COINBASE_API_KEY'], ENV['COINBASE_API_SECRET'])

我想知道放置此代码的最佳位置是什么,如果我将它放在“那里”,我将如何访问它?我希望这个变量(coinbase)可以在应用程序的任何地方访问。

谢谢!

4

3 回答 3

13

这个问题的答案真的取决于你的用例和你的方法。然而,我的一般建议是创建一个服务对象(在 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),而且很快乐 :)。

于 2014-08-31T19:47:21.070 回答
4

使用全局变量的一种方法可以与在 Rails 应用程序中初始化 redis 类似,方法是在config/initializers/coinbase.rb中创建一个初始化程序,其中:

$coinbase = Coinbase::Client.new(ENV['COINBASE_API_KEY'], ENV['COINBASE_API_SECRET'])

现在,您可以访问$coinbase应用程序中的任何位置!

于 2014-08-31T19:43:56.800 回答
0

在文件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

于 2022-01-19T09:27:47.440 回答