如何组织Rails应用程序

时间:2010-12-02 18:07:33

标签: ruby-on-rails architecture ruby-on-rails-3 heroku

我第一次创建一个非常复杂的Rails应用程序。

我想知道按文件夹整理该应用的最佳方法是什么。到现在为止,我会在一个应用程序(所有模型,控制器,etC)下做所有事情,但是阅读一些开源代码我意识到他们将所有内容都放在不同的应用程序中。

例如Spree Commerce。他们有一个通用文件夹,里面有不同的应用程序(API,核心,管理员等)。这是怎么做的,这是最好的方法吗?

我想指出最好的方法(书,博客,任何东西),这样我就能理解如何构建我的应用程序以便将来维护。

谢谢

4 个答案:

答案 0 :(得分:7)

顺便说一句,我认为你的问题的标题有点令人困惑。 Rails通过使用约定优于配置来定义“如何组织Rails应用程序”。我认为你的问题是关于如何架构你的应用程序,而不是任何特定于Rails的东西。也许调整标题?

除此之外,如果不知道有关您项目的任何细节,这是一个棘手的问题,但我会试一试。

所有应用程序应该从简单开始,如果您相信(就像我一样),您应该从构建the simplest thing that could possibly work开始。鉴于此,既然您正在使用Rails,那么最简单的方法就是将您的应用程序构建为一个vanilla Rails 3应用程序。这可能(我说'可能'因为我不知道有关该应用程序的任何细节)允许您快速获得应用程序的测试版并运行,而不必担心在项目开发的这个阶段的复杂性不是问题。

如果您需要创建基于XML或JSON的API,那么Rails使用标准框架来构建really easy,这样您就可以花更多的时间来考虑 API设计而不是如何编写它,它是API设计,这是在第一个实例中最重要的事情。

同样,您的管理员网站可以只是位于不同命名空间中的同一个应用程序的一部分。如果你以后发现你想要它作为一个单独的应用程序的行,你可以这样做(也许你可以使用你设计的那个很棒的API来促进这个),但是为什么要用这个增加的复杂性来设计它(因此延长了开发时间) )首先,如果你没有充分的理由这样做?

一旦您的应用程序启动并运行并且人们开始使用它,您就会开始了解瓶颈所在的位置以及可以改进设计的位置。在此阶段,如果有需要,您可以开始将应用程序的各个部分移动到可扩展的解决方案,例如将API作为独立服务运行,引入缓存,更改数据存储以及其他改进和优化。

即使您的应用程序非常成功(我希望它是!),然后重新设计您的应用程序,继续运行现有服务仍然是完全可能的,正如Twitter已经证明的那样。坚持Knuth's statement,你就没事了。

关于阅读材料,这是一个棘手的问题。对我来说,很多XP和敏捷开发经典教会了我很多关于如何处理程序和应用程序设计的知识。我还会检查this StackOverflow topic的图书灵感。

祝你好运!

答案 1 :(得分:6)

Spree使用Rails'RailtiesRails::Engines)。 Rails 3中引入了铁轨,使其更加模块化,易于扩展。 Rails 3本身就是Railties(ActiveSupport,ActiveModel,ActiveRecord等)的集合。

如果您正在开发一个复杂的应用程序,我建议花一些时间来规划其架构。在没有任何初步规划的情况下设计复杂的应用程序肯定会导致维护噩梦。它还为新团队成员带来了巨大的学习曲线,减慢了新功能的引入速度,当然还有挫折感。

无论如何,不​​要过度优化,但不要忘记根据需要设计您的架构。

答案 2 :(得分:2)

恕我直言,我将创建一个非常复杂的项目作为一个应用程序。我有理由相信Spree和Radiant在单独的应用程序下构建,因此在他们的开源社区的借口下,贡献者可以轻松地贡献代码,而不会篡改核心数据和应用程序的核心工作。

否则,您应该将其构建为一个应用程序。保持整洁。

答案 3 :(得分:0)

这是RoR开发数年来让我保持理智的原因:

  1. 我使用Rails引擎,但将它们保存在与主应用程序相同的代码库中。这是模块化Rails应用程序的良好入门者: https://github.com/shageman/the_next_big_thing

  2. 无论我在哪里,我都可以尝试减少耦合并使用成分来使事情易于测试,可重复使用和维护。这有助于最终将模块或引擎提取为单独的gem。组合由路由(挂载),目录覆盖(资产),依赖注入或配置完成。

  3. 如果我不需要重新使用引擎,我将其放在与主要应用程序相同的代码库中,即单个部署单元。多亏了我不需要在我的IDE中切换项目。在开发环境中,Rails重新加载机制会立即获取对引擎代码的任何更改。

相关问题