J'ai remarqué ce qui suit:
Moteur plein
Avec un moteur complet, l'application parente hérite des routes du moteur. Il n'est pas nécessaire de spécifier quoi que ce soit dans parent_app/config/routes.rb
. La spécification du gem dans Gemfile suffit pour que l'application parente hérite des modèles, des routes, etc. Les routes du moteur sont spécifiées comme suit:
# my_engine/config/routes.rb
Rails.application.routes.draw do
# whatever
end
Pas d'espacement de noms des modèles, des contrôleurs, etc. Ceux-ci sont immédiatement accessibles à l'application parente.
Moteur montable
L'espace de noms du moteur est isolé par défaut:
# my_engine/lib/my_engine/engine.rb
module MyEngine
class Engine < Rails::Engine
isolate_namespace MyEngine
end
end
Avec un moteur montable, les routes sont espacées de noms et l'application parente peut regrouper cette fonctionnalité sous une seule route:
# 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
Les modèles, contrôleurs, etc. sont isolés de l'application parente - bien que les aides puissent être partagées facilement.
Ce sont les principales différences que j'ai repérées. Peut-être y en a-t-il d'autres? J'ai posé la question ici , mais je n'ai pas encore reçu de réponse.
Mon impression est que, comme un moteur complet ne s'isole pas de l'application parente, il est préférable de l'utiliser en tant qu'application autonome adjacente à l'application parente. Je pense que des conflits de noms pourraient survenir.
Un moteur montable peut être utilisé dans les situations où vous souhaitez éviter les conflits de noms et regrouper le moteur sous une route spécifique dans l'application parente. Par exemple, je travaille sur la construction de mon premier moteur conçu pour le service client. L'application parente pourrait regrouper ses fonctionnalités sous une seule route telle que:
mount Cornerstone::Engine => "/cornerstone", :as => "help"
Si je suis loin dans mes hypothèses, quelqu'un s'il vous plaît laissez-moi savoir et je corrigerai cette réponse. J'ai fait un petit article sur le sujet ici Cheers!
mount MyEngine::Engine => "/"
. Cela fonctionne pour les ressources, peut-être que c'est aussi le cas pour les moteurs.Les deux options généreront un moteur . La différence est que
--mountable
cela créera le moteur dans un espace de noms isolé, alors que--full
cela créera un moteur qui partage l'espace de noms de l'application principale.Les différences se manifesteront de 3 manières:
1) Le fichier de classe du moteur appellera
isolate_namespace
:lib / my_full_engine / engine.rb:
lib / my_mountable_engine / engine.rb:
2) Le
config/routes.rb
fichier du moteur sera espacé:Moteur complet:
Moteur monté:
3) La structure des fichiers pour les contrôleurs, les assistants, les vues et les actifs sera nommée:
Explication
Le cas d'utilisation de l'
--full
option semble être très limité. Personnellement, je ne vois aucune bonne raison pour laquelle vous voudriez séparer votre code en un moteur sans isoler également l'espace de noms - Cela vous donnerait essentiellement deux applications étroitement couplées partageant des structures de fichiers identiques et tous les conflits et les fuites de code cela implique.Chaque document que j'ai vu démontre l'
--mountable
option, et en effet le guide de bord actuel vous encourage fortement à inclureisolate namespace
- ce qui revient à dire que l'utilisation est--mountable
terminée--full
.Enfin, il y a confusion terminologique:
rails plugin -h
affiche malheureusement les descriptions suivantes:Cela donne l'impression que vous utilisez
--full
pour créer un "moteur" et--mountable
pour créer quelque chose d'autre appelé "application montable", alors qu'en fait ils sont tous les deux des moteurs - un avec un espace de nom et l'autre pas. Cela ne peut que prêter à confusion, car les utilisateurs qui cherchent à créer un moteur supposeront probablement que--full
c'est l'option la plus pertinente.Conclusion
rails plugin new something --full
= Engine dans l'espace de noms de votre application. (Pourquoi voudrais-tu?)rails plugin new something --mountable
= Moteur avec son propre espace de noms. (Impressionnant)Références
la source
--full
: si vous avez des parties d'un site Web de rails que vous souhaitez conserver intégrées (pas dans un espace de noms isolé) et toujours partager entre différents projets de rails. De plus, cela peut être plus simple que cela: peut-être que votre gemme n'ajoute pas grand chose, mais vous voulez pouvoir l'accrocher correctement.Admin::AdminService.some_action
devez pas modifier vos itinéraires si d'autres applications côté client comme une application Ember utilisent les itinéraires liés au code que vous veulent isoler. --full semble être une étape intermédiaire qui peut être plus facile à implémenter.Je me demandais la même chose et, par conséquent, je me suis retrouvé ici. il me semble que les réponses précédentes couvrent essentiellement la question, mais j'ai pensé que ce qui suit pourrait également aider:
un intérêt particulier (pour moi) est le fait qu'il n'y a pas de différence entre
et
la source
--full
a préséance sur--mountable
?Ma compréhension de la différence est que les moteurs sont comme des plugins et ajoutent des fonctionnalités aux applications existantes. Alors que les applications montables sont essentiellement une application et peuvent être autonomes.
Donc, si vous voulez pouvoir l'exécuter seul ou dans une autre application, vous créerez une application montable. Si vous avez l'intention qu'il s'agisse d'un ajout aux applications existantes, mais qu'il ne soit pas exécuté par lui-même, vous en feriez un moteur.
la source
La différence, je crois, est qu'une application montable est isolée de l'application hôte, elle ne peut donc pas partager de classes - modèles, aide, etc. C'est parce qu'une application montable est un point de terminaison Rack (c'est-à-dire une application Rack à part entière ).
Avertissement: comme la plupart des autres, je viens juste de commencer à jouer avec Rails 3.1.
la source