我在哪里实现对rails app中的外部客户端的调用

时间:2011-10-07 16:56:36

标签: ruby-on-rails

我正在编写一个rails应用程序,它可以调用多个外部Web API,例如Geonnames。我的想法是在单独的模块或类中捕获这个逻辑,并从我的模型和控制器类中调用它们。是否有任何最佳实践可以放置此类代码?它应该是一个单独的非ActiveRecord模型类还是lib文件夹中的模块?或者,在我需要它们的ActiveRecord类中简单地实现WS调用作为静态方法更好吗?

THX

1 个答案:

答案 0 :(得分:1)

有几种方法,但通常我坚持以下原则。

  1. 他们住在/lib(如果你有很多,你可以创建一个/lib/clients子目录)
  2. 他们的名称有GeonamesClientGeonamesWrapper
  3. 他们是您必须实例化的课程
  4. 他们可以从基类继承(或者可能混合一些基本功能)
  5. HTTParty通常是一种很好的方式
  6. 一个例子;

    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