Почему я не могу требовать файл в родительском каталоге в ruby? - PullRequest
8 голосов
/ 20 июля 2011

Обратите внимание, что я не использую Rails.У меня есть структура каталогов, например:

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}

, когда я нахожусь в этом корневом каталоге

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

Но когда я нахожусь вfoo / и выполните одно из следующих действий:

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

Ответы [ 4 ]

6 голосов
/ 20 июля 2011

require основан на вызываемом файле, что обычно означает config.ru.Вам нужен require_relative (который основан на текущем файле) или абсолютный путь.

4 голосов
/ 20 июля 2011

Это может играть роль, в зависимости от того, какую версию ruby ​​вы используете.
Текущий каталог удален из пути загрузки для ruby ​​1.9.2

Я подозреваю, что выпроблема в этой строке: require '../base_classes' в foo/.
Попробуйте вместо этого require_relative '../base_classes' и посмотрите, что произойдет.

Предполагается, что вы используете ruby ​​1.9.2.Если нет, возможно, придется копать глубже.Вы должны пометить вопрос или указать в нем (или оба, предпочтительно), какую версию ruby ​​вы используете.

1 голос
/ 19 сентября 2011

Все, что было нужно, это использовать одну точку вместо двух.

На основании приведенного примера кода:

require File.expand_path("./base_classes.rb")
0 голосов
/ 20 июля 2011

Проблема была на самом деле внутри base_classes.rb, мне нужно было требовать файлы вроде:

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