ruby-on-rails - rails : configurable extensible modular application

标签 ruby-on-rails deployment configuration module

我想使用 Rails 构建一个可扩展的模块化应用程序,该应用程序可以配置以满足个人需求。

让我解释一下我对“可扩展”和“模块化”的理解。例如,假设我正在开发一个博客应用程序引擎并且我有一个名为 BlogEntry 的模型嗯,它包含一个简单的博客条目通常包含的内容 - 标题和内容。假设我希望此应用程序能够以两种模式运行:

  • 简单化BlogEntry只有 2 个属性 - 标题和内容
  • 在增强模式下 - 当 BlogEntry扩展为具有更多属性,例如,它将与名为 Tag 的单独模型进行多对多链接.

我的目标是:

  • 让最终用户使用一些简单的机制以基本形式或扩展功能形式部署应用程序,例如安装附加包、启用/禁用配置开关、取消注释配置文件中的行等。当然,可能有很多超过 2 种“模式”- 这些添加大多是独立的,其中的几种可以同时启用。
  • 明确区分代码库 - 一个仅实现基本功能,一个实现额外的可插入内容(例如现有模型或新模型的额外属性);这些更改不仅应该传播到模型本身,还应该反射(reflect)在 Controller 、 View 、gem 要求、测试、路由规则、支持扩展功能模型所需的数据库迁移等中。
  • 拥有一些用于模型、 Controller 和 View 的面向对象原则:例如,基本模型 BlogEntry只是一个简单的独立类,当插入标签功能包括某种增强模块时 BlogEntry类,将一些代码添加到 BlogEntryController甚至在blogentry的 View 中的某些指定位置添加一些输出。

因此,如果不需要任何复杂的功能,应用程序将保持非常简单和基本。如果有人想要额外的东西,可以使用多个插件扩展应用程序,因此它不会最终成为一个巨大的单一应用程序,它可以做所有的过时软件。

事实上,这种可插入功能几乎存在于任何主要的高级网络开发平台中,例如 MediaWiki、Moodle、WordPress

目前搜索“modular rails”得到:

  • Rails 引擎 - 基本上,如果我理解正确的话,它是一种将大型应用程序分成几个较小的、准独立的应用程序并在它们之间建立链接的方法 - 这不是我想要的。这也允许在多个不同的应用程序中重用一些常见的 Rails 代码,这又是不是我想要的。
  • Rails 插件 - 基本上是一种机制,可以轻松地将外部库以 gem 的形式包含到项目中(带有额外的功能,例如插件提供的生成器) - 但它是一个需要与插件广泛集成的开发人员的解决方案.这通常不适合最终用户管理员必须决定他是否需要此功能的方案 - 没有简单的配置过程来启用或禁用它。
  • Application templates - 基本上,一个现成的应用程序包装在一个生成器中,以便能够快速生成这样的应用程序。这可能对代码重用有用,但与可配置模块化概念无关。

我敢打赌,有无数种方法可以实现我所说的。最好的是什么?我在哪里可以看到这种模块化应用程序的一个很好的例子?

最佳答案

我认为 Rails Engines 确实是您想要的。

我已经为几个应用程序做出了贡献,这些应用程序作为引擎交付,基本上可以完成您描述的内容。这是其中一个主要由我开发的:http://github.com/team-umlaut/umlaut

它并不总是完全直截了当,在很多地方您需要决定如何设置,而 Rails 文档或明显的约定不一定会指导您。我同意(非常有限的)引擎文档不一定会引导您走这条路。但是引擎足以完成需要做的事情。也给你足够的绳子来吊死自己,让事情变得过于复杂。

我建议使用 rails plugin new name_of_engine --full 创建引擎框架 -- 但不是 --mountable。我认为 --mountable 过于复杂,对这种特定类型的引擎用例没有好处。 (其他人可能不同意;是的,回到关于选择和最佳实践的事情,对于这种情况并不总是很清楚)。

Rails 插件基本上已被弃用;当前唯一支持的插件类型是 plugins-as-gems —— 其中 Engine 是最强大的一种(它可以与 Rails 进行最多类型的交互),您将需要这种插件。

我同意你的看法,为什么应用程序模板在这里还不够——尽管你可能想提供一个应用程序模板来创建一个应用程序,在 gemfile 中使用你的引擎,并在本地应用程序中生成任何必要的本地 stub 。我在最新版本的 umlaut 中做到了这一点,但直到最近才这样做,这并不是绝对必要的,我会在你至少有一个基本的概念证明之后再做。

Rails 不一定鼓励这样做,但它是可能的,并且需要足够的工作才能解决,我同意你的看法,它适用于某些事情。

关于ruby-on-rails - rails : configurable extensible modular application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19529710/

相关文章:

ruby-on-rails - 从 RoR 模型中获取两个随机元素

javascript - 在 Ajax 中从另一个页面选择数据

java - “gpg2”未被识别为内部或外部命令

configuration - 如何在Vim中普遍使用相对行号

ruby-on-rails - 在 Rails 中停止恶意用户之间的 session 共享

ruby-on-rails - 更改单个 Controller 的日志级别或 rails 中的操作

asp.net - "The connection string specifies a local Sql Server Express instance",但事实并非如此

r - Shiny 应用程序未在 Shinyapps.io 中运行(错误 : Object UI Not Found)

configuration - 防止修改 Sublime Text 中的行结尾?

tomcat - 在 tomcat 中托管一个位于 war 文件之外的 json 文件