Ruby API包装模块

Ruby API包装模块,ruby,oop,Ruby,Oop,我正在使用HTTParty为第三方RESTAPI编写包装。我希望能够通过调用本地模块调用第三方API,如下所示: APIWrapper::APIObject::APIMethod params = { 'format' = 'json', 'object' = api_object, 'method' = api_method, } get(APIWrapper::BASE_URI, {:query => params}) 我想在APIWrapper中编写一个神奇的函数,

我正在使用HTTParty为第三方
REST
API编写包装。我希望能够通过调用本地模块调用第三方API,如下所示:

APIWrapper::APIObject::APIMethod
params = {
  'format' = 'json',
  'object' = api_object,
  'method' = api_method,
}

get(APIWrapper::BASE_URI, {:query => params})
我想在APIWrapper中编写一个神奇的函数,它接受函数调用并解码对象和方法以调用第三方API。因此,上面的调用将执行以下操作:

APIWrapper::APIObject::APIMethod
params = {
  'format' = 'json',
  'object' = api_object,
  'method' = api_method,
}

get(APIWrapper::BASE_URI, {:query => params})

我希望能够根据调用的方法自动填充
api_对象
api_方法
,这样我就不必为我希望能够进行的每个api调用都显式地编写方法。在
PHP
中,这将使用magic\uuu-get方法完成。Ruby中是否有一个等价物?

这肯定可以在Ruby中实现。您需要在APIWrapper上实现
const_missing
,它将返回一个实现
method_missing
的对象以获取API方法部分:

module APIWrapper
  def const_missing(const_name)
    anon_class = Class.new do
      def method_missing(name, *params, &block)
        params = {
          'format' = 'json',
          'object' = const_name.to_s,
          'method' = name.to_s,
        }
        get(APIWrapper::BASE_URI, {:query => params})
      end
    end
  end
end

查找
method\u missing
。api\u对象是否应作为字符串作为对象的名称?与api_方法相同?是的,APIObject将是对象的名称。因此,它将类似于“用户”或“帐户”。APIMethod将类似于“create”、“update”或“getAll”。