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

时间:2017-08-16 18:35:40

标签: ruby module

我有两个项目,一个"公共代码"我已经制作了一个大型模块的项目,可以引入其他模块:

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

  • 我的常见项目
    • 通用
      • 其余-client.rb
      • 其他带模块的ruby文件......
    • common.rb
    • 的Gemfile
    • 等...

common.rb

require 'bundler'
Bundler.require
require_relative './common/rest_client.rb'
...

module Common
  include RestClient
  # include other modules here...

其余-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

的Gemfile

# frozen_string_literal: true
source 'https://rubygems.org'

gem 'rest-client'
# other gems here...

然后在另一个名为" my-other-project":

的项目中
  • 我的,其他项目
    • 服务
      • service.rb

service.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中的rescue块时出现错误:

NameError - uninitialized constant Common::RestClient::Exception

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

1 个答案:

答案 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