2011-10-07 3 views
1

私はいくつかの外部Web API(Geonnamesなど)を呼び出すrailsアプリケーションを作成しています。私の考えは、このロジックを別のモジュールまたはクラスに取り込み、モデルクラスとコントローラクラスから呼び出すことです。そのようなコードをどこに置くのがベストプラクティスですか?別の非ActiveRecordモデルクラスまたはlibフォルダ内のモジュールである必要がありますか?または、私が必要とするActiveRecordクラスで静的メソッドとしてWS呼び出しを実装する方が良いでしょうか?ここでは、外部クライアントへの呼び出しをレールアプリケーションで実装しますか?

Thxを

答えて

1

いくつかの方法がありますが、それに行うが、一般的に、私は以下の原則に固執します。彼らはあなたが

  • 彼らをインスタンス化する必要があるクラスですGeonamesClientまたはGeonamesWrapper
  • のような名前を持っている彼らは/libに住んで

    1. (あなたは多くを持っている場合、あなたは/lib/clientsサブディレクトリを作成する場合があります)
    2. 基本クラスから継承する(または、おそらくいくつかの基本機能をミックスイン)も
    3. HTTPartyしばしば
    に行くには良い方法です

    例。

    class ClientBase 
        # maybe we pass in a logger, or something 
        def initialize(options={}) 
        end 
    
        # perhaps a central way to call the api 
        def call(method_name, *args) 
        end 
    end 
    
    class GeonamesClient < ClientBase 
    
        base_uri "www.geonames.org" 
    
        def postal_codes(country) 
        ... 
        end 
    end 
    

    次に、インスタンス化して呼び出します。 (クライアント間で何らかの状態を維持できる可能性があります)

    client = GeonamesClient.new(:logger => Address.logger) 
    client.countries.each do |country| 
        client.postal_codes(country) 
    end 
    
  • 関連する問題