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!
mount MyEngine::Engine => "/"
. Funciona com recursos, talvez também seja o caso de motores.Ambas as opções irão gerar um mecanismo . A diferença é que
--mountable
criará o mecanismo em um espaço para nome isolado, enquanto--full
criará um mecanismo que compartilhará o espaço para nome do aplicativo principal.As diferenças serão manifestadas de três maneiras:
1) O arquivo de classe do mecanismo chamará
isolate_namespace
:lib / my_full_engine / engine.rb:
lib / my_mountable_engine / engine.rb:
2) O
config/routes.rb
arquivo do mecanismo terá espaço para nome:Motor completo:
Motor montado:
3) A estrutura do arquivo para controladores, auxiliares, visualizações e ativos terá espaço para nome:
Explicação
O caso de uso da
--full
opção parece ser muito limitado. Pessoalmente, não consigo pensar em nenhuma boa razão para que você queira separar seu código em um mecanismo sem isolar o espaço para nome - essencialmente, apenas forneceria dois aplicativos fortemente acoplados que compartilham estruturas de arquivos idênticas e todos os conflitos e vazamentos de código isso implica.Todas as documentações que eu vi demonstram a
--mountable
opção e, de fato, o guia de borda atual o encoraja fortemente a incluirisolate namespace
- o mesmo que dizer--mountable
sobre o uso--full
.Finalmente, há uma confusão de terminologia: Infelizmente,
rails plugin -h
mostra as seguintes descrições:Isso dá a impressão de que você usa
--full
para criar um "mecanismo" e--mountable
criar outra coisa chamada "aplicativo montável", quando na verdade eles são os dois mecanismos - um com espaço para nome e outro não. Isso pode gerar confusão, já que os usuários que desejam criar um mecanismo provavelmente assumirão que essa--full
é a opção mais relevante.Conclusão
rails plugin new something --full
= Engine no espaço de nome do seu aplicativo. (Por que você?)rails plugin new something --mountable
= Mecanismo com seu próprio espaço para nome. (Impressionante)Referências
fonte
--full
: se você tem partes de um site de rails, deseja manter-se integrado (não em um espaço de nome isolado) e ainda compartilhar entre diferentes projetos de rails. Também pode ser mais simples do que isso: talvez sua gema não adicione muito, mas você deseja conectá-la corretamente.Admin::AdminService.some_action
mas não precisar alterar suas rotas, se outros aplicativos do lado do cliente, como um aplicativo Ember, usarem as rotas relacionadas ao código que você usa. quer isolar. --full parece ser um passo intermediário que pode ser mais fácil de implementar.Eu estava pensando o mesmo e, portanto, acabou aqui. parece-me que as respostas anteriores abrangem basicamente a pergunta, mas achei que o seguinte também poderia ajudar:
de particular interesse (para mim) é o fato de que não há diferença entre
e
fonte
--full
tem precedência--mountable
?Meu entendimento da diferença é que os mecanismos são como plugins e adicionam funcionalidade aos aplicativos existentes. Embora os aplicativos montáveis sejam essencialmente um aplicativo e possam ser independentes.
Portanto, se você quiser executá-lo sozinho ou em outro aplicativo, você criaria um aplicativo montável. Se você pretende que seja uma adição aos aplicativos existentes, mas não é executado por si só, você o tornaria um mecanismo.
fonte
A diferença, acredito, é que os aplicativos montáveis são isolados do aplicativo host, portanto, eles não podem compartilhar classes - modelos, auxiliar etc. Isso ocorre porque um aplicativo Montável é um terminal de Rack (por exemplo, um aplicativo Rack por si só) )
Isenção de responsabilidade: Eu, como a maioria, apenas comecei a brincar com o Rails 3.1.
fonte