我注意到以下几点:
全引擎
对于完整的引擎,父应用程序会继承引擎的路由。没有必要指定任何内容parent_app/config/routes.rb
。在 Gemfile 中指定 gem 足以让父应用继承模型、路由等。引擎路由指定为:
# my_engine/config/routes.rb
Rails.application.routes.draw do
# whatever
end
没有模型、控制器等的命名空间。这些是立即
可由父应用程序访问。
可安装的发动机
引擎的命名空间默认是隔离的:
# my_engine/lib/my_engine/engine.rb
module MyEngine
class Engine < Rails::Engine
isolate_namespace MyEngine
end
end
使用可安装引擎,路由被命名空间,并且父应用程序可以将此功能捆绑在单个路由下:
# 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
模型、控制器等与父应用程序隔离——尽管助手可以轻松共享。
这些是我发现的主要差异。也许还有其他人?我已经问过了here,但尚未收到回复。
我的印象是,由于完整的引擎不会将自身与父应用程序隔离,因此最好将其用作与父应用程序相邻的独立应用程序。我相信可能会发生名称冲突。
当您想要避免名称冲突并将引擎捆绑在父应用程序中的一个特定路由下时,可以使用可安装引擎。例如,我正在致力于构建我的第一个专为客户服务而设计的引擎。父应用程序可以将其功能捆绑在单个路由下,例如:
mount Cornerstone::Engine => "/cornerstone", :as => "help"
如果我的假设与我的假设相距甚远,请有人告诉我,我会修复此响应。我写了一篇关于这个主题的小文章here.