我和Django有点合作,我非常喜欢它的项目/应用程序模型:你可以通过组装一个或多个Django应用程序来构建一个Django项目.这些应用程序可以是自治的,或者某些应用程序可以构建在其他应用程序之上.应用程序可以轻松地依赖于另一个应用程序的模型,以及它的控制器(Django dudes称之为"视图")甚至它的视图(Django中的"模板").
我现在正在开发一个相对大规模的Ruby on Rails项目,我很惊讶地发现在Rails中显然没有简单的方法可以做同样的事情.基本上,在Rails中,一个项目=一个应用程序.我们的项目已经开始作为一个巨大的单片应用程序,我们现在正试图找出如何将其拆分为更小的块.
例如,我们当前的应用程序允许我们管理合作伙伴和合同(以及其他事项).我希望有一个"合作伙伴"应用程序来管理我们的合作伙伴(地址,联系人等)和"合同"应用程序,它将管理我们与合作伙伴的合同."合同"应用程序将依赖于"合作伙伴"应用程序(但为了避免循环依赖,我希望"合作伙伴"应用程序不了解"合同"应用程序).
目前,我认为以下是主要选项:
使这些应用程序通过REST请求进行通信(每个应用程序将充当Web服务):这很好,但它似乎禁止重用其他应用程序的视图.例如,如果"合作伙伴"应用程序有一个很好的页面来显示合作伙伴的详细信息,并且如果我想显示该页面,稍微修改一下,在合同详细信息页面的中间,我看不到其他方法可以做这是让"合同"应用程序通过REST请求向"合作伙伴"应用程序询问合作伙伴详细信息(它将获得对象表示,而不是视图),然后复制/粘贴合作伙伴详细信息页面的源代码来自"合作伙伴"app"到"合同"应用程序.
将这些应用程序转换为插件:不是很好,而且有点困难,但似乎允许模型和视图重用
使用svn external从应用程序到应用程序共享一些模型:简单但难看.
谢谢你的建议.
由于这是我也想做的事情,我可以提供四个 - 不完整且相对未经测试(由我)"解决方案":
没有特别的顺序......
使用Rails 引擎插件,它现在显然适用于2.2.这在某种程度上可能会进入Rails 2.3(见下文)
切换到 Merb,它有一些叫做"切片"的东西可能会提供你想要的东西.无论如何,如果 这 是正确的(我是谁,我怀疑耶胡达卡茨?)无论如何,总有一天会是同样的事情,这很酷.
看看Edge Rails 中的引擎功能("Edge"是最新提交但尚未发布的版本,因此它通常可以工作,但可能不是100%的生产质量).
查看在routes.rb中使用名称空间 - 将名称分配app
给名称空间意味着您可以将其放入相关app
子目录中的子目录中,尽管对于每个"应用程序"都有一组单独的Rails目录可能不那么干净.
其中,我没有(2)的经验,因为我(在基础设施方面)与Rails绑定,但是没关系,我喜欢Rails.我打算看一下(1)和也许(3),因为2.3可能会在我需要部署我的下一个主要版本之前发布,而我已经尝试过(4),它有效,但很好,很好一点点(对我而言)令人困惑.