我有两个项目,一个"公共代码"我已经制作了一个大型模块的项目,可以引入其他模块:
以下是" my-common-project"的文件夹结构:
require 'bundler'
Bundler.require
require_relative './common/rest_client.rb'
...
module Common
include RestClient
# include other modules here...
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...
然后在另一个名为" my-other-project":
的项目中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中的rescue块时出现错误:
NameError - uninitialized constant Common::RestClient::Exception
我不确定如何表达我的问题,但是在某个地方,似乎常见的模块正在丢失其他类的其他客户端模块,在此示例中为Exception。有人可以解释为什么这种集总方法然后包含许多模块的方法都不起作用吗?
答案 0 :(得分:2)
由于您有一个名为Common::RestClient
的类,并且正在使用定义类RestClient
的ruby gem,当您在Common
模块中时,您将会需要使用RestClient
前缀引用宝石::
,否则,它会假设您正在谈论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