Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在rails应用程序中,我在哪里实现对外部客户端的调用_Ruby On Rails - Fatal编程技术网

Ruby on rails 在rails应用程序中,我在哪里实现对外部客户端的调用

Ruby on rails 在rails应用程序中,我在哪里实现对外部客户端的调用,ruby-on-rails,Ruby On Rails,我正在编写一个rails应用程序,它调用几个外部web API,例如Geonnames。我的想法是在单独的模块或类中捕获此逻辑,并从模型和控制器类中调用它们。在哪里放置这样的代码有什么最佳实践吗?它应该是独立的非ActiveRecord模型类还是lib文件夹中的模块?或者,在需要WS调用的ActiveRecord类中,简单地将WS调用实现为静态方法更好吗 Thx有几种方法,但通常我坚持以下原则 他们住在/lib(如果你有很多,你可以创建一个/lib/clients子目录) 它们的名称类似于Geo

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


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

  • 他们住在
    /lib
    (如果你有很多,你可以创建一个
    /lib/clients
    子目录)
  • 它们的名称类似于
    GeonamesClient
    GeonamesWrapper
  • 它们是必须实例化的类
  • 它们可以从基类继承(或者混入一些基类功能)
  • 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
    

    有几种方法可以做到这一点,但通常我坚持以下原则

  • 他们住在
    /lib
    (如果你有很多,你可以创建一个
    /lib/clients
    子目录)
  • 它们的名称类似于
    GeonamesClient
    GeonamesWrapper
  • 它们是必须实例化的类
  • 它们可以从基类继承(或者混入一些基类功能)
  • 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