在 class 中使用模块的方法

Using a module's methods inside a class

我正在尝试将 API 集成到 class 中,但不知道如何将模块放置到位。

class PlivoNumber < ActiveRecord::Base
  require 'plivo'
  include Plivo 

def initialize_plivo

 @p = RestAPI.new(ENV['PLIVO_AUTH_ID'], ENV['PLIVO_AUTH_TOKEN'])
end

def delete_number
  self.initialize_plivo
  params = {
    'number' => self.number
  }
  response = @p.unrent_number(params)

end

我已经尝试了 include 和 Extend

如果我在初始化中使用

self.RestAPI.new(ENV['PLIVO_AUTH_ID'], ENV['PLIVO_AUTH_TOKEN'])

NoMethodError: undefined method `RestAPI' for #<PlivoNumber:0x007f8eca9523f0>

如果我使用

RestAPI.new(ENV['PLIVO_AUTH_ID'], ENV['PLIVO_AUTH_TOKEN'])

NameError: uninitialized constant PlivoNumber::RestAPI

基本上我希望能够 运行 @plivo_number.delete_number 并让应用程序点击 api 并执行操作。 我很欣赏初始化步骤并没有真正对 class 做任何事情,但没有它我无法进行下一步。

希望这有点道理,我的印象是我正在做的事情可能有点混乱....

您应该可以在包含 Plivo 模块后访问 RestAPI class。确保你已经正确安装了 plivo gem。这是您的代码的更多 ruby​​ish 版本:

class PlivoNumber < ActiveRecord::Base
  include Plivo 

  def delete_number
    api.unrent_number('number' => number)
  end

  private

  def api
    @api ||= RestAPI.new(ENV['PLIVO_AUTH_ID'], ENV['PLIVO_AUTH_TOKEN'])
  end
end

此外,您不需要将 Plivo 模块包含到 PlivoNumber class 中,您可以使用 Plivo::RestAPI 代替。

进一步解释 Donatas 的回答:

如果您查看 plivo 的源代码 (https://github.com/plivo/plivo-ruby/blob/master/lib/plivo.rb),您会看到如下结构:

module Plivo

   (...)
   class RestAPI
      (...)
   end
   (...)
end

在这种情况下,如果您 include Plivo,您将获得其中定义的所有 classes(包括 RestAPI),就像在本地定义一样。因此,您可以直接访问它们,如 Donatas 的代码片段所示:

def api
  @api ||= RestAPI.new(ENV['PLIVO_AUTH_ID'], ENV['PLIVO_AUTH_TOKEN'])
end

正如他提到的,您也可以在任何 Ruby class 中仅 require Plivo,并且您可以通过其命名空间路径访问 RestAPI。在控制器中,例如:

require 'plivo'

class OperationsController < ApplicationController

  def plivo
    plivo = Plivo::RestAPI.new(ENV['PLIVO_AUTH_ID'], ENV['PLIVO_AUTH_TOKEN'])
    ...
  end
end