我注意到以下几点:
全引擎
使用完整的引擎,父应用程序从引擎继承路由。没有必要在 中指定任何内容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
模型、控制器等与父应用程序隔离 - 尽管可以轻松共享帮助程序。
这些是我发现的主要区别。也许还有其他人?我在这里问过,但还没有收到回复。
我的印象是,由于完整的引擎不会将自己与父应用程序隔离,因此最好将其用作与父应用程序相邻的独立应用程序。我相信可能会发生名称冲突。
在您希望避免名称冲突并将引擎捆绑在父应用程序中的一个特定路径下的情况下,可以使用可安装引擎。例如,我正在构建我的第一个为客户服务设计的引擎。父应用程序可以将其功能捆绑在单个路由下,例如:
mount Cornerstone::Engine => "/cornerstone", :as => "help"
如果我的假设与我的假设相去甚远,请有人告诉我,我会修正这个回复。我在这里写了一篇关于这个主题的小文章 干杯!