我有 2 个项目,一个"通用代码"项目,我把它做成一个大模块,它引入了其他模块,如下所示:
以下是"my-common-project"的文件夹结构:
-
my-common-project
-
common
- rest-client.rb
- 其他带有模块的 Ruby 文件...
- 通用.rb
- 宝石文件
- 等。。。
-
common
通用.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