在 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。这是您的代码的更多 rubyish 版本:
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
我正在尝试将 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。这是您的代码的更多 rubyish 版本:
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