2009-10-15 2 views
0

У меня есть engine style Rails plugin, из которого я могу создать драгоценный камень, используя Jeweler. Но когда я требую его в моей среде Rails (или erb), модели внутри плагина не загружаются. Я следил за несколькими учебниками и читал все о предмете.Как воссоздать плагин Rails (двигатель)?

# environment.rb 
config.gem 'myengine' 

# in irb 
require 'myengine' 

Я распаковал драгоценный камень и подтвердил, что все файлы присутствуют. Мой init.rb был перемещен в новую папку под названием «rails» as per. Все файлы в 'lib' автоматически добавляются в $ LOAD_PATH, поэтому require 'myengine' работает lib/myengine.rb. Я проверил это, поставив puts 'hello' внутри.

Это связано с физическим присутствием плагинов в известном месте, где Rails может добавлять все модели, контроллер и т. Д. К соответствующим load_paths? Нужно ли повторять это вручную при использовании драгоценного камня?

Может ли gemspec require_paths быть способом добавления дополнительных путей, кроме lib? Я предполагаю, однако, что Rails не просто требует каждый отдельный файл, но загружает их по требованию, следовательно, необходимо, чтобы имя файла и имя класса совпадали?

ответ

0

Проблема заключалась в том, что файлы (в приложении) не добавляются в драгоценный камень, потому что при использовании Jeweler он только автоматически добавляет файлы в required_paths, которые привязаны к git.

0
%w{ models controllers helpers }.each do |dir| 
    path = File.join(File.dirname(__FILE__), 'app', dir) + '/' 

    $LOAD_PATH << path 

    puts 'requiring' 
    Dir.new(path).entries.each do |file| 
    if file =~ /\.rb/ 
     puts file 
     require file 
    end 
    end 
end 

Добавив вышеуказанное в lib/myengine.rb, все модели/контроллеры необходимы. Но, как я сказал в своем вопросе, вряд ли это будет хорошим шагом вперед.

+0

В режиме разработки это работает только для первого запроса. – Kris

0

Оффлайн Я бы сказал, что часть добавления этих каталогов к пути поиска находится прямо на. То, что вам не нужно делать, - это каждый файл вручную (как вы упомянули в своем последнем предложении). Что делает Rails, когда вы ссылаетесь на несуществующую константу, является поиск файла с тем же именем (подчеркнуто, конечно) в пути загрузки.

Если по каким-то причинам вы не можете соблюдать ограничения (думать об этом долго и упорно), то вы будете нуждаться, чтобы копать глубже в Rails и посмотреть, как перегрузочный механизм работает так что вы можете связать в нем должным образом в развитии Режим.

+0

Просто добавление пути поиска не работает. Это может быть связано с проблемой перезагрузки классов - я собираюсь попробовать дальнейшие эксперименты. Возможно, мне нужны мои плагины для перезагрузки при каждом запросе ... – Kris

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