【问题标题】:Include module not working in gem包含模块在 gem 中不起作用
【发布时间】:2018-06-27 01:03:40
【问题描述】:

我有一个名为private_lib 的宝石。 文件lib/private_lib.rb 包含以下内容:

require 'private_lib/version'
require 'private_lib/handicap'
require 'private_lib/traversal_cap'

module PrivateLib

end

lib/private_lib/handicap.rb 文件包含以下内容

# module for handicap functions
class Handicap
  include TraversalCap
  -- other code
end

文件lib/private_lib/traversal_cap.rb 包含以下内容

module TraversalCap
  def some_method
  end
  -- other code
end

我还有一个测试文件spec/handicap_spec.rb,其中包含以下内容

require "spec_helper"
describe Handicap do
  include TraversalCap
  -- some tests that access the ```Handicap``` class
  -- some tests that access directly the traversal_cap some_method.
end

当我运行rspec spec/handicap_spec 时,出现以下错误

private_lib/lib/private_lib/handicap.rb:3:in `<class:Handicap>': uninitialized constant Handicap::TraversalCap (NameError)
    from private_lib/lib/private_lib/handicap.rb:2:in `<top (required)>'

为什么障碍类看不到 traversal_cap 模块?

【问题讨论】:

  • 嗨@Obromios 这是因为您在handicap 下方需要traversal_cap,但是您在障碍中包含了traversal_cap,因此它无法找到该模块。解决方案是你应该这样做:require 'private_lib/version' require 'private_lib/traversal_cap' require 'private_lib/handicap' module PrivateLib end

标签: ruby rspec rubygems


【解决方案1】:

这是因为您需要文件的顺序。

在运行require 'private_lib/handicap' 行时,它会读取handicap.rb 文件并点击include TraversalCap 所在的行。但是此时您还没有运行require 'private_lib/traversal_cap',所以模块是未定义的。

快速解决方法是更改​​require 调用的顺序,或者将require 'private_lib/traversal_cap' 放在障碍文件的顶部。

【讨论】:

  • 那行得通,我习惯在具有自动加载功能的 Rails 上使用 ruby​​。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2016-02-17
  • 2016-08-27
  • 1970-01-01
  • 2013-04-02
  • 2014-06-26
相关资源
最近更新 更多