Я заметил следующее:
Полный двигатель
В случае полного движка родительское приложение наследует маршруты от движка. Не нужно ничего указывать в parent_app/config/routes.rb
. Указать гем в Gemfile достаточно, чтобы родительское приложение унаследовало модели, маршруты и т. Д. Маршруты движка указываются как:
# my_engine/config/routes.rb
Rails.application.routes.draw do
# whatever
end
Никаких пространств имен моделей, контроллеров и т. Д. Они сразу же доступны для родительского приложения.
Подвижный двигатель
По умолчанию пространство имен движка изолировано:
# my_engine/lib/my_engine/engine.rb
module MyEngine
class Engine < Rails::Engine
isolate_namespace MyEngine
end
end
С монтируемым движком маршруты распределены по пространству имен, и родительское приложение может объединить эту функциональность в один маршрут:
# my_engine/config/routes.rb
MyEngine::Engine.routes.draw do
#whatever
end
# parent_app/config/routes.rb
ParentApp::Application.routes.draw do
mount MyEngine::Engine => "/engine", :as => "namespaced"
end
Модели, контроллеры и т. Д. Изолированы от родительского приложения, хотя помощниками можно легко делиться.
Это основные отличия, которые я заметил. Может, есть и другие? Я спросил здесь , но до сих пор не получил ответа.
У меня сложилось впечатление, что, поскольку полный движок не изолирует себя от родительского приложения, его лучше всего использовать как отдельное приложение, смежное с родительским приложением. Я считаю, что могут произойти конфликты имен.
Подключаемый движок можно использовать в ситуациях, когда вы хотите избежать конфликтов имен и связать движок по одному определенному маршруту в родительском приложении. Например, я работаю над созданием своего первого двигателя, предназначенного для обслуживания клиентов. Родительское приложение может объединить свои функции по одному маршруту, например:
mount Cornerstone::Engine => "/cornerstone", :as => "help"
Если я ошибаюсь в своих предположениях, дайте мне знать, и я исправлю этот ответ. Я сделал небольшую статью на эту тему здесь Ура!
mount MyEngine::Engine => "/"
. Это работает для ресурсов, возможно, это также относится к двигателям.Оба варианта сгенерируют двигатель . Разница в том
--mountable
, что движок будет создан в изолированном пространстве имен, тогда как--full
будет создан движок, который разделяет пространство имен основного приложения.Различия проявятся 3 способами:
1) Файл класса движка будет вызывать
isolate_namespace
:Библиотека / my_full_engine / engine.rb:
Библиотека / my_mountable_engine / engine.rb:
2)
config/routes.rb
Файл движка будет иметь пространство имен:Полный двигатель:
Установленный двигатель:
3) Файловая структура для контроллеров, помощников, представлений и ресурсов будет иметь пространство имен:
объяснение
Вариант использования этой
--full
опции кажется очень ограниченным. Лично я не могу придумать какой-либо веской причины, по которой вы хотели бы разделить свой код в движок, не изолировав также пространство имен - по сути, это просто даст вам два тесно связанных приложения, совместно использующих идентичные файловые структуры, и все конфликты и утечку кода. что влечет за собой.Каждая часть документации , которую я видел демонстрирует
--mountable
вариант, и на самом деле текущий руководство края настоятельно рекомендует вам включитьisolate namespace
- что то же самое , как говорят использование--mountable
более--full
.Наконец, есть путаница в терминологии: К сожалению,
rails plugin -h
показаны следующие описания:Создается впечатление, что вы используете его
--full
для создания «движка» и--mountable
чего-то еще, называемого «монтируемым приложением», хотя на самом деле они оба движка - один с пространством имен, а другой нет. Это обязательно приведет к путанице, поскольку пользователи, которые хотят создать движок, скорее всего, решат, что--full
это более подходящий вариант.Вывод
rails plugin new something --full
= Двигатель в пространстве имен вашего приложения. (Почему ты?)rails plugin new something --mountable
= Двигатель с собственным пространством имен. (Потрясающие)Ссылки
источник
--full
: если у вас есть части веб-сайта rails, которые вы хотите сохранить интегрированными (не в изолированном пространстве имен) и по-прежнему использовать их в разных проектах rails. Также это может быть проще: возможно, ваш драгоценный камень не так много добавляет, но вы хотите иметь возможность правильно его подключить.Admin::AdminService.some_action
но не должны изменять свои маршруты, если другие клиентские приложения, такие как приложение Ember, используют маршруты, связанные с кодом, который вы хочу изолировать. --full кажется промежуточным шагом, который может быть проще реализовать.мне было интересно то же самое и, следовательно, я оказался здесь. Мне кажется, что более ранние ответы в основном охватывают этот вопрос, но я подумал, что может помочь и следующее:
особенно интересен (для меня) тот факт, что нет разницы между
и
источник
--full
имеет приоритет--mountable
?Я понимаю разницу в том, что движки похожи на плагины и добавляют функциональность существующим приложениям. В то время как монтируемые приложения по сути являются приложениями и могут работать автономно.
Поэтому, если вы хотите иметь возможность запускать его отдельно или в другом приложении, вы должны создать монтируемое приложение. Если вы хотите, чтобы он был дополнением к существующим приложениям, но не запускался сам по себе, вы бы сделали его движком.
источник
Я считаю, что разница в том, что монтируемые приложения изолированы от хост-приложения, поэтому они не могут совместно использовать классы - модели, помощники и т. Д. Это связано с тем, что монтируемое приложение является конечной точкой стойки (т. Е. Приложение стойки само по себе ).
Отказ от ответственности: я, как и большинство, только начал играть с Rails 3.1.
источник