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

この質問に対する答えは、ユースケースとアプローチによって異なります。ただし、私の一般的な推奨事項は、Coinbase API とのすべての通信を処理するサービス オブジェクトを作成することです(DDD の意味で) 。そして、このサービス オブジェクト内で、Coinbase::Client オブジェクトを 1 回初期化するだけで、何回呼び出してもかまいません。次に例を示します。

# 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 ファイルの autoload パスに追加する必要がある場合があります。私は通常、これを追加するだけです:

# config/application.rb
config.autoload_paths += %W(#{config.root}/app)

このサービス オブジェクト アプローチは、組織的に非常に有益であり、より効率的 (必要な新しい Coinbase クライアントの呼び出しは 1 回だけ) であり、テストが容易であり (への呼び出しを簡単にモックアウトできますCoinbase::Client)、単純に楽しいものです :)。

于 2014-08-31T19:47:21.070 に答える
4

グローバル変数を持つ方法の 1 つは、 config/initializers/coinbase.rbで初期化子を作成することにより、Rails アプリケーションで redis を初期化するのと同じように行うことができます。

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

$coinbaseこれで、アプリ内のどこにでもアクセスできます!

于 2014-08-31T19:43:56.800 に答える