Rails 3.1:引擎与可安装应用程序

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

有人能帮我理解Rails引擎和可挂载应用程序之间的区别吗?在Rails 3.1中,可以使用“Rails新插件”创建任何一个插件___“”命令。

rails plugin new forum --full        # Engine
rails plugin new forum --mountable   # Mountable App

你什么时候想用一种对另一种?我知道你可以把引擎包装成宝石。对于可安装的应用程序来说不是这样吗?还有什么不同吗?

提问于
用户回答回答于

我注意到以下情况:

全发动机

对于完整引擎,父应用程序从引擎继承路由。没有必要在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" 
用户回答回答于

区别在于--mountable将在单独的命名空间中创建引擎,而--full将创建一个共享主应用程序名称空间的引擎。

这些差异将以三种方式表现出来:

1)引擎类文件将调用isolate_namespace

自由/我_满的_引擎/工程b:

module MyFullEngine
  class Engine < Rails::Engine
  end
end

自由/我_可装_引擎/工程b:

module MyMountableEngine
  class Engine < Rails::Engine
    isolate_namespace MyMountableEngine # --mountable option inserted this line
  end
end

2)发动机config/routes.rb文件将命名空间:

全引擎:

Rails.application.routes.draw do
end

安装发动机:

MyMountableEngine::Engine.routes.draw do
end

3)控制器、助手、视图和资产的文件结构将命名为:

创建应用程序/控制器/我的_可装_发动机/申请_操纵者.rb 创建应用程序/助手/我的_可装_发动机/申请_helper.rb 创建应用程序/邮递员创建应用程序/模型 创建应用程序/视图/布局/我的_可装_发动机/application.html.erb 创建应用程序/资产/图像/我的_可装_发动机创建应用程序/资产/样式表/我的_可装_发动机/申请。 创建应用程序/资产/JavaScript/我的_可装_发动机/application.js 创建config/routeres.rb创建lib/my_可装_工程Rb 创建库/任务/我的_可装_工程耙 创建lib/my_可装_引擎/版本 创建lib/my_可装_发动机/工程bundefined

的用例--full选择似乎非常有限。就我个人而言,我想不出有什么好的理由可以让想要将代码分离到一个引擎中,而不需要隔离名称空间--这将给您提供两个紧密耦合的应用程序,它们共享相同的文件结构,以及所有的冲突和代码泄漏。

--mountable选项,强烈鼓励你包括isolate namespace-这和说“使用”是一样的--mountable过关--full

最后是术语混淆:不幸的是rails plugin -h显示以下描述:

-充分#生成一个钢轨发动机使用捆绑Rails应用程序进行测试-可安装#生成可安装的隔离应用程序undefined

这给人的印象是--full创建一个“引擎”和--mountable创建一个叫做“可装载的应用程序”的其他东西,而实际上它们都是引擎--一个名称空间,另一个不是。这必然会导致混乱,因为希望创建引擎的用户可能会假设--full是更相关的选择。

结语

  • rails plugin new something --full=应用程序名称空间中的引擎。
  • rails plugin new something --mountable=具有自己的命名空间的引擎。

扫码关注云+社区