【问题标题】:How can I cut a large Rails application into smaller applications that work together?如何将大型 Rails 应用程序拆分为可以协同工作的小型应用程序?
【发布时间】:2010-09-28 07:24:36
【问题描述】:

我使用过 Django,我非常喜欢它的项目/应用程序模型:您可以通过组装一个或多个 Django 应用程序来构建一个 Django 项目。这些应用程序可以是自治的,或者某些应用程序可以构建在其他应用程序之上。一个应用程序可以很容易地依赖另一个应用程序的模型,以及它的控制器(Django 帅哥称它们为“视图”)甚至它的视图(Django 中的“模板”)。

我现在正在处理一个相对较大的 Ruby on Rails 项目,我很惊讶地发现在 Rails 中做同样的事情显然没有简单的方法。基本上,在 Rails 中,一个项目 = 一个应用程序。我们的项目一开始是一个巨大的单体应用程序,现在我们正试图弄清楚如何将其拆分成更小的块。

例如,我们当前的应用程序允许我们管理合作伙伴和合同(除其他外)。我想要一个“合作伙伴”应用程序来管理我们的合作伙伴(地址、联系人等)和一个“合同”应用程序来管理我们与合作伙伴的合同。 “合同”应用程序将依赖于“合作伙伴”应用程序(但为了避免循环依赖,我希望“合作伙伴”应用程序不了解“合同”应用程序)。

目前,我认为以下是主要选项:

  1. 使这些应用程序通过 REST 请求进行通信(每个应用程序都将充当 Web 服务):这很好,但它似乎禁止重用其他应用程序的视图。例如,如果“合作伙伴”应用程序有一个不错的页面来显示合作伙伴的详细信息,并且如果我想在合同详细信息页面的中间显示该页面,稍作修改,我看不到其他方法可以做这比让“合同”应用程序通过 REST 请求向“合作伙伴”应用程序询问合作伙伴详细信息(它将获得对象表示,而不是视图),然后从“合作伙伴”应用到“合同”应用。
  2. 将这些应用程序变成插件:没有那么好,而且有点困难,但似乎允许模型和视图重用
  3. 使用 svn external 从应用程序到应用程序共享一些模型:简单但丑陋。

感谢您的建议。

【问题讨论】:

    标签: ruby-on-rails deployment refactoring code-reuse


    【解决方案1】:

    我使用了沙漠插件(以前的“插件加”)。它似乎工作得很好。 http://github.com/pivotal/desert/tree/master

    【讨论】:

      【解决方案2】:

      如果你想调查 Mike 的 #2 选项,Merb slices 有a screencast on the topic that is helpful

      【讨论】:

        【解决方案3】:

        由于这也是我想做的事情,我可以提供四种不完整且相对未经测试(由我)的“解决方案”:

        排名不分先后……

        1. 使用 Rails engines 插件,它现在显然适用于 2.2。这在一定程度上或全部可能会被纳入 Rails 2.3(见下文)

        2. 切换到 Merb,哪个 有一种叫做“切片”的东西 可能会提供您正在寻找的东西。 无论如何,如果 this 是正确的(我该怀疑谁 Yehuda Katz?)一切都一样 反正总有一天会做,这很酷。

        3. 看看 Edge Rails 中的engines functionality(“Edge”是最新提交但未发布的版本,因此它通常可以工作,但可能还不是 100% 的生产质量)。

          李>
        4. 考虑使用namespaces in routes.rb - 将app 中的项目分配给命名空间意味着您可以将其放入相关app 子目录中的子目录中,尽管这可能比单独设置不太干净每个“应用程序”的 Rails 目录。

        其中,我没有 (2) 的经验,因为我(在基础架构方面)与 Rails 绑定,但没关系,我喜欢 Rails。我打算看看 (1) 或者 (3),因为 2.3 可能会在我需要部署我的下一个主要版本之前发布,而且我已经尝试过 (4),它有效,但是,嗯,繁琐和(对我来说)有点困惑。

        【讨论】:

        • 我们已经去 Merb 进行我们专门针对切片的项目之一。它工作得相当好。我很好奇 Rails 3 合并中会发生什么。
        • 不知何故,我忽略了(或忘记了)引擎插件,直到今天我再次偶然发现它。现在我需要在假期中抽出一些时间来评估我是否能从中得到我想要的东西。哼哼。还是嗬嗬嗬骗子?
        【解决方案4】:

        我对 RoR 的看法是将您的“应用程序”编写为 Rails 中的控制器。他们可以非常独立,但可以共享助手和观点。我不了解 Django,所以可能术语不同。

        【讨论】:

          猜你喜欢
          • 2016-08-08
          • 1970-01-01
          • 1970-01-01
          • 2013-01-01
          • 2023-03-25
          • 2016-11-15
          • 1970-01-01
          • 1970-01-01
          • 2014-03-15
          相关资源
          最近更新 更多