Eu notei o seguinte:
Motor completo
Com um mecanismo completo, o aplicativo pai herda as rotas do mecanismo. Não é necessário especificar nada parent_app/config/routes.rb
. A especificação da gema no Gemfile é suficiente para o aplicativo pai herdar os modelos, rotas etc. As rotas do mecanismo são especificadas como:
# my_engine/config/routes.rb
Rails.application.routes.draw do
# whatever
end
Nenhum espaço para nome de modelos, controladores, etc. Estes são imediatamente acessíveis ao aplicativo pai.
Motor Montável
O espaço para nome do mecanismo é isolado por padrão:
# my_engine/lib/my_engine/engine.rb
module MyEngine
class Engine < Rails::Engine
isolate_namespace MyEngine
end
end
Com um mecanismo montável, as rotas têm espaço para nome e o aplicativo pai pode agrupar essa funcionalidade em uma única rota:
# 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
Modelos, controladores etc. são isolados do aplicativo pai - embora os auxiliares possam ser compartilhados facilmente.
Essas são as principais diferenças que vi. Talvez haja outros? Eu perguntei aqui , mas ainda não recebi uma resposta.
Minha impressão é que, como um mecanismo completo não se isola do aplicativo pai, ele é melhor usado como um aplicativo autônomo adjacente ao aplicativo pai. Eu acredito que conflitos de nomes podem ocorrer.
Um mecanismo montável pode ser usado em situações nas quais você deseja evitar conflitos de nome e agrupar o mecanismo em uma rota específica no aplicativo pai. Por exemplo, estou trabalhando na construção do meu primeiro mecanismo projetado para atendimento ao cliente. O aplicativo pai pode agrupar sua funcionalidade em uma única rota, como:
mount Cornerstone::Engine => "/cornerstone", :as => "help"
Se eu estiver muito longe de minhas suposições, alguém por favor me avise e eu corrigirei esta resposta. Eu fiz um pequeno artigo sobre o assunto aqui Cheers!