Можете ли вы добавить более одного локального движка в приложение Rails 3?

#ruby-on-rails #gem

#ruby-on-rails #rubygems

Вопрос:

Я пытаюсь разбить несколько частей функциональности повторно используемого приложения на движки Rails. У меня вообще нет проблем с запуском одного движка, но приложение, похоже, не загружает данные с последующих движков. Я разрабатываю несколько движков одновременно, поэтому я добавляю их в gemfile моего тестового приложения с параметром:path.

Вот моя (упрощенная) настройка (мое понимание абсолютного минимума для настройки движка с простой моделью):

my_engines/engine1/lib/engine1.rb:

 module Engine1
require 'engine' if defined?(Rails) amp;amp; Rails::VERSION::MAJOR == 3
end
  

my_engines/engine1/lib/engine.rb:

 require 'engine1'
require 'rails'

module Engine1
class Engine < Rails::Engine

end
end
  

my_engines/engine1/app/models/engine1/model1.rb:

 module Engine1
    class Model1
    end
end
  

Мой второй движок, engine2, настроен идентично и в том же родительском каталоге (только с именем engine2 и моделью model2).

Я использую jeweler для упаковки и генерации gemspecs для обоих движков, и мне требуются оба движка в тестовом приложении следующим образом:

my_engines/testapp/Gemfile:

 gem 'engine1', :path => '../engine1'
gem 'engine2', :path => '../engine2'
  

Странно то, что когда я запускаю консоль rails для своего тестового приложения, Engine1::Model1.new работает, но Engine1::Model1.new приводит к «ошибке имени: неинициализированной константе Engine2::Model2». Похоже, это верно для всех моделей, маршрутов, контроллеров и т.д., Которые я включаю в любые последующие движки. Я безрезультатно порылся в Интернете. Есть мысли?

Ответ №1:

Я думаю, что я понял это. На всякий случай, если кто-нибудь еще случайно играет с движками Rails3 (настоятельно рекомендуется) и столкнется с этой проблемой (надеюсь, нет), проблема заключалась в том, что мой файл engine.rb и мои файлы engine_name.rb находились рядом в каталоге библиотеки. Решение состоит в том, чтобы создать каталог engine_name в lib и поместить туда свой файл engine.rb (я предполагаю, что Rails загружает только первый файл engine.rb, который он находит в каталоге библиотеки gem или плагина). Итак…

Плохо (загружает только один engine.rb в главном приложении):

 /some_engine 
   |-- lib 
   |-- some_engine.rb 
   |-- engine.rb 
  

Кажется, работает:

 /some_engine 
   |-- lib 
   |-- some_engine.rb 
   |-- some_engine 
       |-- engine.rb