2015-10-01 2 views
0

У меня есть папка в моей папке lib, которая содержит модуль и некоторые подмодули. Упрощенная это выглядит следующим образом:Расширение модулей в Rails

структура папок

lib/bottles 
lib/bottles/bottles.rb 
lib/bottles/caps.rb 

bottles.rb

module Bottles 
    def hello_bottles 
    puts "Hello Bottles" 
    end 
end 

caps.rb

module Bottles 
    module Caps 
    def hello_caps 
     puts "Hello Caps" 
    end 
    end 
end 

Кроме того, в config/application.rb У меня есть следующая строка:

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

I включает модуль и его подмодули в моем классе, как так:

class MyClass 
    extend Bottles 
    extend Bottles::Caps 
end 

Проблема заключается в том, что вызов MyClass.hello_caps работает просто отлично и печатает "Hello Caps", но называть MyClass.hello_bottles дает мне неопределенную ошибку метода:

NoMethodError: undefined method 'hello_bottles' for MyClass 

Каков правильный синтаксис и конфигурация для расширения модуля верхнего уровня Bottles, поэтому я могу использовать его методы как методы класса?

ответ

1

Проблема в том, как Rails автоматически загружает все, что я считаю. Поскольку он будет искать модуль верхнего уровня в файле, расположенном в <load_path>/bottles.rb, он не находит его (вот почему cap работает, потому что он ищет все подмодули внутри каталога с тем же именем, что и модуль верхнего уровня). Таким образом, решение состоит в том, чтобы переместить файл bottles.rb на уровень каталогов.

+0

Обновлено мой ответ, это работает для меня. – tpbowden

+0

Это работает, спасибо. Чувствует себя немного уродливым, хотя не все сгруппировано. Вы знаете, как заставить его работать с 'bottles.rb' и' caps.rb' в той же папке? –

+0

Мое единственное предложение - прекратить использование автозагрузчика и потребовать явно, где это необходимо. Поскольку lib уже находится на пути загрузки, вы можете просто «потребовать» бутылки/бутылки «' 'и' require 'bottles/caps "' – tpbowden

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