Dowker
Dowker

Reputation: 79

NameError: uninitialized constant error

Given the following code:

module Backup
  module Destination
    class Base
      def initialize
        puts 'Base'
      end
    end
  end
end

module Backup
  module Destination
    class Test < Base
      def initialize
        puts 'Test'
        super
      end
    end
  end
end

Backup::Destination::Test.new

This works as expected, outputting:

Test
Base

However if I split things up like this:

# lib/backup.rb
require_relative 'backup/destination/base'

module Backup; end


# lib/backup/destination/base.rb
require_relative 'test'

module Backup
  module Destination
    class Base
      def initialize
        puts 'Base'
      end
    end
  end
end


# lib/backup/destination/test.rb
module Backup
  module Destination
    class Test < Base
      def initialize
        puts 'Test'
        super
      end
    end
  end
end

And execute with the following (from irb):

require_relative 'lib/backup'

I get this error:

NameError: uninitialized constant Backup::Destination::Base
    from /lib/backup/destination/test.rb:3:in `<module:Destination>'
    from /lib/backup/destination/test.rb:2:in `<module:Backup>'
    from /lib/backup/destination/test.rb:1:in `<top (required)>'
    from /lib/backup/destination/base.rb:1:in `require_relative'
    from /lib/backup/destination/base.rb:1:in `<top (required)>'
    from /lib/backup.rb:1:in `require_relative'
    from /lib/backup.rb:1:in `<top (required)>'
    from (irb):1:in `require_relative'

What am I missing?

Note: I couldn't post the above without adding more details. Stupid feature because in this case code is worth a thousand words. (this text allowed the question to be posted)

Upvotes: 1

Views: 1688

Answers (2)

Dowker
Dowker

Reputation: 79

Made the following changes to fix the problem:

# lib/backup.rb
require_relative 'backup/destination/base'
require_relative 'backup/destination/test'

module Backup; end

And removed the require_relative statement from lib/backup/destination/base.rb. This fixed the order of the require_relative statements. I mistakenly thought the files were required before anything was executed.

Upvotes: 0

Jesus Castello
Jesus Castello

Reputation: 1113

The problem is that you are requiring test.rb before your Base class is defined. One possible solution is to move your require to the bottom of base.rb.

Another possible solution is to remove your require from base and require both files in the correct order from backup.

Upvotes: 1

Related Questions