2015-06-01 4 views
2

Я знаю, что Rails имеет мнение о том, как должно быть имя моих классов и модулей. Таким образом, я попытался с этим сблизиться.
В каталоге/Библиотека/query_finder Rails.root, я иметь следующую структуру:Rails не находит классы в модулях

/lib 
    /query_finder 
    /adapters 
     active_record.rb 
     mongoid.rb 
     base.rb 
    /strategies 
    base.rb 

В base.rb, я назвал свой класс так:

module QueryFinder 
    class Base 
    end 
end 

В адаптерах/base.rb Я назвал свой класс так:

module QueryFinder 
    module Adapters 
    class Base 
    end 
    end 
end 

В адаптерах/mongoid.rb, я назвал свой класс так:

module QueryFinder 
    module Adapters 
    class Mongoid 
    end 
    end 
end 

В адаптерах/active_record.rb, я назвал свой класс, как:

module QueryFinder 
    module Adapters 
    class ActiveRecord 
    end 
    end 
end 

Но Rails не может найти адаптеры. Я пытаюсь захватить все константы:

> QueryFinder::Adapters.constants 
=> [] 

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

config.autoload_paths += Dir["#{config.root}/lib/**/"] 

Что я могу делать неправильно?

Я просто хочу, чтобы сделать отметку, что Я могу ссылаться на константы и классы, как так:

QueryFinder::Adapters::Base 
=> QueryFinder::Adapters::Base 

Проблема заключается в том, когда я использую метод константы, это дает пустой массив.

ответ

0

Проблема - ленивая загрузка. Рельсы в режиме производства обычно настраиваются для ленивой загрузки. Это означает, что константы фактически не определены до тех пор, пока вы их не свяжете: в это время он замечает, что вы ссылаетесь на неопределенную константу, находит файл и загружает его.

Если вы отключили ленивую загрузку, тогда вы можете положиться на константы, чтобы рассказать вам, что доступно. Но производительность пострадает.

Другим обходным решением было бы явно загрузить необходимые файлы.

Смежные вопросы