He notado lo siguiente:
Motor completo
Con un motor completo, la aplicación principal hereda las rutas del motor. No es necesario especificar nada en parent_app/config/routes.rb
. Especificar la gema en Gemfile es suficiente para que la aplicación principal herede los modelos, rutas, etc. Las rutas del motor se especifican como:
# my_engine/config/routes.rb
Rails.application.routes.draw do
# whatever
end
Sin espacio de nombres de modelos, controladores, etc. Estos son inmediatamente accesibles para la aplicación principal.
Motor montable
El espacio de nombres del motor está aislado de forma predeterminada:
# my_engine/lib/my_engine/engine.rb
module MyEngine
class Engine < Rails::Engine
isolate_namespace MyEngine
end
end
Con un motor montable, las rutas tienen un espacio de nombres y la aplicación principal puede agrupar esta funcionalidad en una sola ruta:
# 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
Los modelos, controladores, etc. están aislados de la aplicación principal, aunque los ayudantes se pueden compartir fácilmente.
Estas son las principales diferencias que he detectado. ¿Quizás hay otros? He preguntado aquí , pero aún no he recibido una respuesta.
Mi impresión es que, dado que un motor completo no se aísla de la aplicación principal, es mejor utilizarlo como una aplicación independiente adyacente a la aplicación principal. Creo que podrían producirse conflictos de nombres.
Se podría utilizar un motor montable en situaciones en las que desee evitar conflictos de nombres y agrupar el motor en una ruta específica en la aplicación principal. Por ejemplo, estoy trabajando en la construcción de mi primer motor diseñado para servicio al cliente. La aplicación principal podría agrupar su funcionalidad en una única ruta, como:
mount Cornerstone::Engine => "/cornerstone", :as => "help"
Si me equivoco en mis suposiciones, que alguien me lo haga saber y arreglaré esta respuesta. He hecho un pequeño artículo sobre el tema aquí ¡Saludos!