简体   繁体   中英

Include module not working in gem

I have a gem called private_lib . The file lib/private_lib.rb contains the following:

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

module PrivateLib

end

The lib/private_lib/handicap.rb file contains the following

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

and the file lib/private_lib/traversal_cap.rb contains the following

module TraversalCap
  def some_method
  end
  -- other code
end

I also have a test file spec/handicap_spec.rb which contains the following

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

When I run rspec spec/handicap_spec , I get the following error

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)>'

Why isn't the handicap class seeing the traversal_cap module?

It is because of the order you require the files.

At the time the line require 'private_lib/handicap' is run it reads the handicap.rb file and hits the line where you include TraversalCap . But you haven't yet run require 'private_lib/traversal_cap' at this point so the module is undefined.

Quick fix is to change the order of the require calls, or alternatively put require 'private_lib/traversal_cap' at the top of the handicap file.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM