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!
mount MyEngine::Engine => "/"
. Funciona para los recursos, tal vez ese también sea el caso de los motores.Ambas opciones generarán un motor . La diferencia es que
--mountable
creará el motor en un espacio de nombres aislado, mientras--full
que creará un motor que comparte el espacio de nombres de la aplicación principal.Las diferencias se manifestarán de 3 formas:
1) El archivo de clase de motor llamará
isolate_namespace
:lib / my_full_engine / engine.rb:
lib / my_mountable_engine / engine.rb:
2) El
config/routes.rb
archivo del motor tendrá un espacio de nombres:Motor completo:
Motor montado:
3) La estructura de archivos para controladores, ayudantes, vistas y activos tendrá un espacio de nombres:
Explicación
El caso de uso de la
--full
opción parece ser muy limitado. Personalmente, no puedo pensar en ninguna buena razón por la que desee separar su código en un motor sin aislar también el espacio de nombres. Básicamente, solo le brindaría dos aplicaciones estrechamente acopladas que comparten estructuras de archivos idénticas y todos los conflictos y fugas de código. eso implica.Cada pieza de documentación que he visto demuestra la
--mountable
opción y, de hecho, la guía de borde actual le recomienda encarecidamente que la incluyaisolate namespace
, que es lo mismo que decir que se--mountable
acabe el uso--full
.Finalmente, hay confusión terminológica: Desafortunadamente,
rails plugin -h
muestra las siguientes descripciones:Esto da la impresión de que se utiliza
--full
para crear un "motor" y--mountable
para crear algo más llamado "aplicación montable", cuando en realidad ambos son motores: uno con espacio de nombres y el otro no. Eso seguramente generará confusión, ya que los usuarios que buscan crear un motor probablemente asumirán que--full
es la opción más relevante.Conclusión
rails plugin new something --full
= Motor en el espacio de nombres de su aplicación. (¿Por que lo harias?)rails plugin new something --mountable
= Motor con su propio espacio de nombres. (Increíble)Referencias
fuente
--full
: si tiene partes de un sitio web de rieles, desea mantenerlo integrado (no en un espacio de nombres aislado) y aún compartir entre diferentes proyectos de rieles. También puede ser más simple que eso: tal vez su gema no agregue tanto, pero desea poder engancharla correctamente.Admin::AdminService.some_action
pero no tiene que cambiar sus rutas si otras aplicaciones del lado del cliente como una aplicación Ember usan las rutas relacionadas con el código que usted quiero aislar. --full parece un paso intermedio que puede ser más fácil de implementar.Me preguntaba lo mismo y, por lo tanto, terminé aquí. Me parece que las respuestas anteriores básicamente cubren la pregunta, pero pensé que lo siguiente también podría ayudar:
de particular interés (para mí) es el hecho de que no hay diferencia entre
y
fuente
--full
tiene precedencia sobre--mountable
?Mi comprensión de la diferencia es que los motores son como complementos y agregan funcionalidad a las aplicaciones existentes. Mientras que las aplicaciones montables son esencialmente una aplicación y pueden ser independientes.
Entonces, si desea poder ejecutarlo solo o dentro de otra aplicación, debería crear una aplicación montable. Si tiene la intención de que sea una adición a las aplicaciones existentes, pero no se ejecute solo, lo convertiría en un motor.
fuente
La diferencia, creo, es que las aplicaciones montables están aisladas de la aplicación host, por lo que no pueden compartir clases: modelos, ayudantes, etc. Esto se debe a que una aplicación montable es un punto final de Rack (es decir, una aplicación de Rack por derecho propio ).
Descargo de responsabilidad: como la mayoría, recién comencé a jugar con Rails 3.1.
fuente