Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't I require a file in the parent directory in ruby?

Note that I am not using Rails. I have a directory structure like:

foo/
bar/
base_classes/
base_classes.rb

base_classes.rb:

 Dir.glob(File.expand_path(File.join("base_classes/config/constants", "*.rb"))) { |file| require file}
 Dir.glob(File.expand_path(File.join("base_classes", "*.rb"))) { |file| require file}

when I am in this root directory

>> require 'base_classes' #=> true
>> Card.load!
[stuff happens]

But when I am in foo/ and do either of the following:

>> require '../base_classes' #=> true
>> require File.expand_path("../base_classes.rb") #=> true
>> require File.expand_path("../base_classes") #=> true
>> Card.load!
>> NameError: uninitialized constant Card
like image 474
Jeremy Smith Avatar asked Jul 19 '11 20:07

Jeremy Smith


3 Answers

require is based on the file that gets called, which usually means config.ru. You need require_relative (which is based on the current file), or an absolute path.

like image 153
Denis de Bernardy Avatar answered Oct 20 '22 09:10

Denis de Bernardy


This may be playing a part, depending on which version of ruby you're using.
Current directory removed from load path for ruby 1.9.2

I suspect your problem is this line: require '../base_classes' when in foo/.
Try require_relative '../base_classes' instead and see what happens.

This is assuming you are using ruby 1.9.2. If not, may need to dig deeper. You should tag the question or mention in it (or both, preferrably) which version of ruby you're running.

like image 25
bergyman Avatar answered Oct 20 '22 11:10

bergyman


All that was needed was to use a single dot instead of two dots.

Based on the given example code:

require File.expand_path("./base_classes.rb")
like image 29
Joe Harris Avatar answered Oct 20 '22 09:10

Joe Harris