2012-06-30 3 views
1

Я пытаюсь извлечь часть моего проекта Rails в свой каталог lib, но я не могу понять, как правильно связать мои файлы. Моя структура каталогов выглядит следующим образом:Организация файлов в каталоге lib

lib/ 
    eventable/ 
    calendar.rb 
    helpers.rb 
# Rest of rails directories/files 

Я требуя eventable каталог в config/application.rb:

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

Мои помощники и календарь Р.Б. файлы:

# helpers.rb 
module Eventable 
    module Helpers 
    def calendar_for... 
     Calendar.new... 
    end 
    end 
end 

# calendar.rb 
module Eventable 
    class Calendar 
    # methods defined here 
    end 
end 

Я затем смешивание my Eventable :: Helpers в регулярных помощниках Rails, чтобы я мог использовать calendar_for в моих представлениях:

ActionView::Base.send :include, Eventable::Helpers 

Этот последний шаг, кажется, работает нормально. Тем не менее, когда я иду к виду, который с помощью этого помощника я получаю:

uninitialized constant Eventable::Helpers::Calendar 

Если я изменить мой помощник, так что он пытается получить доступ к Eventable::Calendar.new вместо этого я получаю:

uninitialized constant Eventable::Calendar 

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

ответ

1

У меня была аналогичная проблема. Я решил это, изменив способ, которым нужны модули.

В application.rb

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

Создать /lib/eventable.rb со следующим кодом

require "eventable/helpers" 
require "eventable/calendar" 
+0

Спасибо, что это сработало. Вы знаете, почему это необходимо? Это связано с тем, что автозагрузка не может загрузить их в правильном порядке?Или потому, что тот факт, что я использую класс Calendar из помощника вида, недостаточно, чтобы сказать Rails, что класс должен быть загружен автоматически (т. Е. К тому времени, когда он добирается там, уже слишком поздно?) –

+0

Я не думаю, что это имеет какое-то отношение к приказу или помощникам. Проблема исходит от Ruby. Расположение модулей должно соответствовать структуре каталогов, как и вы, но когда они требуются непосредственно из подкаталога, это вызывает ошибку. Взгляните на это: [Лучшая практика для Ruby требует] (http://devblog.vworkapp.com/post/910714976/best-practice-for-rubys-require). –

3

Похоже, вам нужен файл типа загрузчика, чтобы сообщить Rails, где найти код для модуля Eventable.

Попробуйте добавить lib/eventable.rb с:

module Eventable 
    autoload :Calendar, 'eventable/calendar' 
    autoload :Helpers, 'eventable/helpers' 
end 

Вам не нужно, чтобы изменить путь загрузки, если у вас есть файл загрузчика на месте.

+0

Спасибо, я попытался создать этот файл, но я получаю следующее error: 'невозможно загрузить такой файл - eventable/calendar'. Есть идеи? –

+0

Какую версию Ruby вы используете? Несколько вещей, которые нужно попробовать, - добавить «.rb» в автозагрузку или взять путь lib/eventable из вашего пути загрузки. Просто имея каталог lib в вашем пути загрузки, он должен забрать загрузчик eventable.rb. –

+0

Я использую ruby ​​1.9.3p125 и попытался удалить выпуклый dir из моего пути загрузки (т. Е. Просто каталог lib там сейчас) и попытался с '.rb', но все дают мне ту же ошибку. Ответ Вавы работал на меня, хотя. Спасибо за вашу помощь! –

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