0

Я пытаюсь сделать некоторые классы наследуемыми от базового класса в каталоге Rails lib.Inheritance in Rails каталог lib

Установка выглядит следующим образом:

#lib/ab_tests/base.rb 
module AbTests 
    class Base 
    # some methods... 
    end 
end 

#lib/ab_tests/first_test.rb 
module AbTests 
    class FirstTest < AbTests::Base 
    # some methods... 
    end 
end 

я потребовать, чтобы эти файлы в config/application.rb в довольно стандартным способом

config.autoload_paths += %W(#{Rails.root}/lib/ab_tests) 

Однако, когда я пытаюсь запустить сервер, я получаю фатальная LoadError :

[some path].../activesupport-3.2.12/lib/active_support/dependencies.rb:503:in `load_missing_constant': Expected [project name]/lib/ab_tests/base.rb to define Base (LoadError) 

Я пробовал оба следующих и это одна и та же проблема каждый раз.

#lib/ab_tests/first_test.rb 
class FirstTest < ::AbTests::Base 

#lib/ab_tests/first_test.rb 
class FirstTest < Base 

Кроме того, если удалить ссылку на AbTests::Base из lib/ab_tests/base.rb, то нет никакой ошибки нагрузки, так что это не просто тот факт, что класс существует, что вызывает проблему. Проблема возникает только тогда, когда я пытаюсь ее использовать.

Как я могу выполнить это наследование и почему возникает эта проблема?

ответ

1

Я обычно структурировать эти вещи, как это:

-lib 
    |- ab_tests.rb 
    |- ab_tests/ 
     |- base.rb 
     |- first_test.rb 

Где ab_tests.rb является:

module AbTests 
end 

В base.rb и first_test.rb файлы должны быть, как вы перечислили их в первом примере, за исключением вас не нужно указывать пространство имен, когда вы объявляете его в модуле (т. е. просто используйте class FirstTest < Base вместо class FirstTest < AbTests::Base).