0

テスト環境、開発環境、ステージング環境、本番環境のいずれにいるかによって、動作が異なるクリーンな方法を探しています。

私の質問は一般的ですが、私が持っている最も具体的な例は通知の送信です。Userモデルオブジェクトにnotifyという関数があるとしましょう

def notify(message)
  #send a notification to the user (differs depending on the environment)
end

テスト環境では、通知をファイルに保存するだけのモックオブジェクトを使用したいと思います。ステージング環境と本番環境では、実際にAPIリクエストをサードパーティのサービスに送信するPushNotificationオブジェクトを使用したいと思います。環境ごとに異なるAPIキーを使用する必要があります。

lib / notifiersにフォルダーを作成し、file_notifier.rbとpush_notifier.rbを作成することを考えていました。どこ(どのファイル)で、どのように正しい通知機能を初期化するのかわかりません。何か案は?

ありがとう!

4

1 に答える 1

2

手始めに、私はちょっと気まぐれな雌犬になります—あなたには関数はありませんが、メソッドがあります。ご覧のとおり、メソッドはレシーバーオブジェクトで呼び出されます。なぜこれが重要なのですか?あなたがそれについて真剣に考えるならば、それはあなたが抱えている困難の原因を明らかにするからです:

ユーザーオブジェクトには、「通知」オブジェクトの出力場所を切り替えるビジネスはありません。

したがって、問題を解決するための最初のステップは、通知を処理し、環境に基づいて適切に動作するように独立して構成できるオブジェクトを作成することです。このオブジェクト自体は環境を認識したり気にしたりする必要はありませんが、開発時に簡単にモックできるように構成可能development.rbである必要があります。これは、ファイルまたはイニシャライザーのいずれかで発生する可能性があります(おそらくconfigure_notifier.rb、どの環境でも構成されます)。 )。

異なるAPIキーを使用する限り、それはまったく別の問題です。これらをリポジトリに保存することは本当に望ましくありません。これを行うために一般的に受け入れられている方法は、実行している環境を維持するように構成することです。彼ら。Herokuの場合、一般的な例として、をheroku config:add SOMESERVICE_API_KEY=abcdefg12345使用して構成でこれを実行してアクセスできますENV['SOMESERVICE_API_KEY']

于 2012-07-10T19:47:11.470 に答える