Ruby:在模块中调用 gem 子类会产生未初始化的常量



我有 2 个项目,一个"通用代码"项目,我把它做成一个大模块,它引入了其他模块,如下所示:

以下是"my-common-project"的文件夹结构:

  • my-common-project
    • common
      • rest-client.rb
      • 其他带有模块的 Ruby 文件...
    • 通用.rb
    • 宝石文件
    • 等。。。

通用.rb

require 'bundler'
Bundler.require
require_relative './common/rest_client.rb'
...
module Common
include RestClient
# include other modules here...

rest-client.rb

module Common
module RestClient
def call_rest_service_get(url)
begin
response = RestClient.get(url, {accept: :json})
rescue RestClient::Exception => err
return err.response
else
return response
end
end
end

宝石文件

# frozen_string_literal: true
source 'https://rubygems.org'
gem 'rest-client'
# other gems here...

然后在另一个名为"我的其他项目"的项目中:

  • 我的其他项目
    • 服务
      • 服务.rb

服务.rb

require_relative './../../../common/common.rb'
class Service
include Common
def get_rest_data
call_rest_service_get('http://some-url.com)
end
end

当代码进入 rest-client.rb 中的救援块时,我收到一个错误:

NameError - uninitialized constant Common::RestClient::Exception

我不确定如何表达我的问题,但是在某个地方,似乎公共模块正在失去其他类的其余客户端模块,在本例中为异常。有人可以解释为什么这种集中然后包含许多模块的方法不起作用吗?

由于您有一个名为Common::RestClient的类,并且正在使用定义类RestClient的 ruby gem,因此当您在Common模块中时,您需要引用带有::前缀RestClient的 gem,否则,它会假设您在谈论Common::RestClient

module Common
module RestClient
def call_rest_service_get(url)
begin
response = ::RestClient.get(url, {accept: :json})
rescue ::RestClient::Exception => err
return err.response
else
return response
end
end
end

最新更新