#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