如何在Rails应用程序中实现Modularization?

时间:2011-07-21 23:47:05

标签: ruby-on-rails ruby modularization

Breaking a large rails app into smaller apps?

Modularizing Rails applications

Best practice for structuring a 'large' Rails app

我在一个大型Ruby on Rails应用程序中有一个关于模块化的快速问题。

设置:

我正在构建一个存储人员信息的核心应用程序。我还有几个“模块”以非常不同的方式使用这些信息。 (例如,一个人可以显示关于人的信息,另一个人可以找出他们之间的联系和共性等)。

问题:

如何有效地模块化这个应用程序?

潜在的答案:

由于模块与核心应用程序(以及彼此)共享模型和视图,因此我将它们组合到一个应用程序中是有意义的。但是,随着应用程序的增长,这显然会导致问题。这对我来说建议命名空间控制器和模型“How to organize controller in moderately large Rails application?”或使用引擎“Modularizing Rails applications”。

由于模块处于主动开发状态,因此在它们上使用轨道生成器非常有用,这似乎使得使用引擎时很痛苦。看起来虽然从Rails的角度来看完全支持引擎,但在缺乏生成器支持和数据库迁移方面,它们似乎仍然相当hacky。有没有人有成功开发引擎的经验?如果你有一个工作的应用程序想要将它移植到一个插件(即复制粘贴代码),似乎引擎将是一个很好的解决方案,但如果你正在积极开发它(更改模型等),这将是困难的。

我看到的最后一件事是使用多个应用程序和一个数据库。这种方式看起来像皇家的痛苦与迁移和保持模型等等。但我想我也会对此有所了解。

5 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

我不会使用引擎。引擎用于在应用程序之间共享功能。你想要做的不是分享功能,而是组织它。

为了整理你的代码,你可以做很多事情。

  • 使用名称空间。
  • 保持控制器薄。
  • 让你的模特保持瘦身(是的,你的模特;见下一个要点)
  • 使用数据上下文交互(DCI)模式。
  • 使用像Apotomo或Cells这样的小部件框架。
  • 编写测试,以便重构。
  • 如果您的应用程序的责任增长过多,请考虑面向服务的体系结构(考虑超媒体API设计)。

Andrzej有很多关于DCI的文章。

http://andrzejonsoftware.blogspot.com/2011/08/dci-patterns-how-to-write-dci-contexts.html

答案 2 :(得分:0)

  • 一个应用程序,一个数据库。
  • 在模块之间共享模型。
  • 命名空间您的控制器和视图。
  • 测试。

答案 3 :(得分:0)

您还可以使用Rack Middleware来处理特定任务。

对于您的大部分应用程序,Engines似乎是最好的解决方案 - 这也是我正在考虑的事情。看起来您可以轻松地在引擎中define generators

答案 4 :(得分:0)

根据数据的结构和访问模式,将应用程序分成多个应用程序可能很有用,另外,还可以通过(RESTful)API提供数据访问。

根据我的经验,当您的应用程序从中型到大型增长时,这可以实现最佳结构,并迫使您考虑结构和关注点分离。扩大规模通常也更容易。