1

複数のサードパーティ API で動作する Rails アプリがあります。これらの API の一部はレート制限されており、多くのメソッドは完了するまでに数時間かかる場合があり、リクエストの準備ができているかどうかを継続的に確認する必要があります。そのため、すべての荷物を管理するためのキューイング システムを構築しました。

このキューに入る各リクエストには、リクエストが関係するサードパーティ API、メソッド、引数、およびレスポンスを処理するためのコールバックの詳細を示す JSON 文字列があります。非常に多くのコールバック メソッドが必要になり、それらは非常に異なるタスクを処理します。サード パーティのサービス ステータスを更新するものもあれば、顧客情報を更新するものもあれば、大きな CSV をダウンロードしたり CSV を解析するためにキューに入れられた別の要求を作成したりするものもあります。

これらの無関係なコールバック メソッドをどこに配置すればよいかわかりません。それらは非常に多様であり、非常に多くの異なるモデルに干渉しているため、それらを QueuedRequest モデルの下に配置するのが正しいかどうかはわかりません (ただし、特にテストに関してはそれが最も簡単に思えます)。それらを 1 つの場所に統合したいので (テストを簡単にするために)、それらを関連するモデルに押し込もうとしても (多くの場合、モデルとはまったく関連していない可能性があります)、うまくいきません。

ある種のユーティリティ クラスが最適な場所のようですが、そのファイルをどこに置くのでしょうか?

詳細: Rails 3.2.6


更新:以下の回答を詳しく説明するために、私が最終的に行ったことは、ユーティリティ メソッドのモジュールを /lib/api に配置することでした。/lib/api を /config/application.rb の autoload_paths に追加し、言及されていないのですが、モジュールをアプリにロードするための初期化子を作成しました。

/lib/api/callbacks.rb

module Callbacks
  extend self
  def some_method
    # magic
  end
end

/config/application.rb

config.autoload_paths += %W(#{config.root}/lib/api)

/config/initializers/application.rb

require 'callbacks'
4

3 に答える 3

4

ディレクトリの下で、libオートロード パス (アプリがスレッドセーフの場合はeagerload パス) に追加することを忘れないでください! というフォルダーをapi作成し、その内容を名前空間に貼り付けます

例えば、lib/api/stack_overflow.rb

module API
   class StackOverflow
     # schtuff
   end
end
于 2012-08-20T04:05:11.143 に答える
1

いつでも lib フォルダーに入れることができます。

于 2012-08-20T03:50:39.063 に答える
1

私は、外部 API を照会し、実際に DB に保存せずにデータをユーザーに提示するアプリケーションに取り組んでいます。このプロセスにはさまざまな要素 (API キーとユーザー ID を API に渡す、リクエスト内のクエリ パラメータを検証する、レスポンスを解析するなど) が含まれますが、実際の Rails アプリケーションとはあまり関係がありません (これは、主にこのデータをユーザーに提示することに重点を置いています)、そのため、すべての API を .xml の下の独自のディレクトリに分割しましたlib

このようにすることで、メインのアプリケーションとは別にテストできるため、問題が明確に分離されます。また、ライブラリのクラスはアクティブモデルに基づいていないため、ライブラリを独自の gem に分割して、他の非レール プロジェクトで使用できる可能性があります。たとえば、シナトラのレールを切り替えることを検討しましたが、現在のセットアップでは簡単に実行できます。

于 2012-08-20T03:55:21.153 に答える