Обновленный ответ
Я обобщаю все свои выводы в своем блоге, вам лучше посмотреть там:
Старый ответ
Я тоже искал решение для этого, и (для полноты картины, а также для указания другим в этом направлении) вот что я нашел.
Начиная с Rails3.1, двигатели можно легко генерировать с помощью команды rails plugin new my_plugin --full
. Это создает каркас для двигателя.
--full
означает, что механизм будет «объединен» прямо с приложением включения, так что, например, контроллеры должны быть доступны напрямую, как если бы они были определены в приложении включения. Это позволяет вам, например, у вас есть вспомогательный файл в my_engine/app/helpers/my_helper.rb
, который будет объединен с app/helpers/my_helper.rb helper
.
вашего включаемого приложения.
Есть еще одна опция --mountable
, которая создает пространство имен для движка, так что его контроллеры и т. Д. Никогда не будут конфликтовать с включенными приложениями. Это приводит, например, к помощник, находящийся в my_engine/app/helpers/my_engine/my_helper.rb
, который не будет сталкиваться с помощником app/helpers/my_helper.rb
в вашем включающем приложении.
Теперь более интересная часть :
В папке test
сгенерированного движка есть папка dummy
, которая содержит законченное приложение Rails! Для чего это?
Когда вы разрабатываете двигатель, его функциональные возможности должны работать полностью самостоятельно, и он также должен быть полностью протестирован самостоятельно. Таким образом, это «неправильный» способ разработки движка «внутри» другого приложения Rails (хотя это интуитивно часто кажется правильным при извлечении существующих функций из приложения Rails в движок), и поэтому теоретически он также не нужен для перезагрузки движка. код с каждым запросом к приложению.
Кажется, что «правильный» путь: разрабатывать и тестировать свой движок, как если бы это было полноценное приложение Rails с использованием приложения dummy
! Здесь вы можете делать все, что можете, в любом «обычном» приложении Rails, например, создавать контроллеры, модели, представления и т. д., использующие функции, которые должен обеспечивать движок. Обычно вы также можете запустить сервер, используя rails s
в своем каталоге test/dummy
и получить доступ к фиктивному приложению на localhost:3000
, а при запуске ваших тестов приложение dummy
автоматически используется для интеграционных тестов. Довольно мило! : -)
Вы должны быть осторожны, куда положить свои вещи:
- Любая функциональность, предназначенная для использования в другом приложении Rails, входит в
my_engine/app
, тогда как любая функциональность, которая необходима только для тестирования функциональности движка, входит в test/dummy/app
.
Затем вы можете легко загрузить свой движок в Gemfile
вашего основного приложения, например так: gem 'my_engine', :path => 'path/to/my_engine'
или опубликовать его на GitHub в качестве драгоценного камня.
(Одна интересная вещь (и возвращаясь к теме этой темы) состоит в том, что, когда я запускаю сервер манекена, тогда все изменения в движке, кажется, отражаются внутри него! Так что каким-то образом представляется возможным включить движок в приложении Rails без его кеширования ...? Я не знаю, как это происходит.)
Итак, подведем итог: движок обеспечивает функциональность, которая может полностью функционировать самостоятельно, поэтому его также следует разрабатывать и тестировать самостоятельно. Затем, когда он достиг стабильного состояния, он может быть включен любым другим приложением, которому требуется его функциональность.
Вот некоторые ресурсы, которые я считаю полезными:
Надеюсь, вы найдете этот ответ полезным. Я все еще очень плохо разбираюсь в двигателях, поэтому, если есть какая-то неправильная информация, пожалуйста, сообщите мне, и я исправлю ее.