ruby-on-rails - Rails 最佳实践 - 引擎

标签 ruby-on-rails rails-engines

我目前正在将应用程序升级到 Rails 4。我计划为少数人安装此应用程序,但他们有不同的需求。我决定利用这个升级版本的时间将我的一些模型放入引擎中。目标是减少根据情况需要调整应用程序的时间。核心应用程序将管理基本资源,引擎将添加功能(该应用程序正在管理小型组织的成员资格)。
我阅读了很多文档,包括“指南”。我测试了一些引擎来查看应用程序的行为。以下是我无法通过搜索回答的问题:

1 - 命名约定:

你如何命名你的引擎?我的第一次尝试是通过他们的函数来命名它,但是当我生成我的第一个模型时,我发现我不能为我的模型使用函数名称。

我在想类似的东西:Coreappname_functionality

例如,我想为我的成员添加事件,引擎将被命名为:member_activities

2 - 完整与可安装

我读了很多关于这个主题的文章,很多人似乎都在使用可安装的引擎。我尝试了这两种方法,我认为完整的选项实现起来非常快(没有路由,没有我必须注意的命名空间隔离)。但我也理解类(class)冲突的风险。如果我是唯一一个为这个应用程序编写代码的人,那么使用完整的引擎是一个坏习惯(这只是一个懒惰的问题)。即使我不打算在其他应用程序中使用可挂载引擎,还有其他优势吗?

3 - “如果引擎存在?”

在核心应用程序中,我将放置所有引擎需要的代码。例如,在侧边栏中,我想显示最后事件的列表,但前提是使用事件引擎。目标是将所有必要的代码放在核心应用程序中,但根据引擎的存在与否来使用这些代码。

在我的测试期间,我使用了:

if defined? Activity
  @activities = Activity.all
end

并将其呈现为这样的 View :
<% if defined? Activity %>
 <h3><%= @activities.first.title %></h3>
<% end %>

它运作良好,但我不确定这是一个好习惯。有替代方案吗?

在我进入引擎世界之前,你有什么建议吗?
我更喜欢在尝试之前发布我的问题,而不是在尝试之后发布我的错误!

最佳答案

对于任何阅读它的人...

我认为对于什么是独立引擎存在误解。事实上,这有点令人困惑。有些人可能认为在孤立和不孤立之间进行选择有点像偏好问题。但这并不完全正确。

孤立的引擎就是这样。一个孤立的引擎。它不适合您的应用程序的“模块”。它更像是您的应用程序的“子应用程序”。区别很关键。您的应用程序的模块可能会共享模型、api 或一些业务逻辑。尽管如此,责任的封装很重要,但会有一些联系。例如,可能几乎所有模块都将使用 EventDispatcher 模块之类的东西。而独立引擎本身就是一个完整的应用程序。尽管它可以使用来自主机应用程序的模型,但它不能使用来自不同隔离引擎的模型(至少没有黑客攻击,在“某些情况下”会很痛苦,这通常是一个坏主意,会导致糟糕的设计)。

因此,如果您尝试使用隔离引擎实现您的应用程序模块,您可能最终会将所有模型存储在主/主机应用程序中,以便在您的 - 实际上 - 子应用程序之间重用。可能与 View 相同。也许还有 Assets 。如果必须共享某些业务逻辑,它可能也会最终出现在主应用程序中。所以这基本上违背了整个目的。这就是为什么您应该为您的模块使用非独立引擎的原因。虽然隔离引擎适用于完全封装的子应用程序。例如,如果您想在主应用程序旁边拥有一个电子商务商店(spree gem 正是这样做的)。

一个更企业化的例子是 ERP 系统。它可能有子应用程序,例如:CRM、资源管理等(隔离引擎)。这些子应用程序可以有自己的模块(不是独立的引擎)。

只是为了我的答案的完整性。作为一个独立的引擎,我的意思是使用 rails plugin new engine_name --mountable 生成,而使用 rails plugin new engine_name --full 将生成未隔离的.

免责声明:

也许在某些情况下,您想采用不同的方式(可能是在实现某种神奇的 gem 做一些神奇的事情时),但这取决于您自己想办法。通过这个答案,我的意思是它应该适用于大多数应用程序。

关于ruby-on-rails - Rails 最佳实践 - 引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20203392/

相关文章:

ruby-on-rails - 查询 : where has_many association does not contain specific value

ruby-on-rails - 在 Ruby 中迭代 1 个月的小时数需要 15 秒 - 在 Ruby 中迭代时间间隔的最佳方法是什么?

ruby-on-rails - 在 Rails 中使用 google-maps-for-rails gem 时设置标记颜色

html - 如何使用 slim 语法转义 HTML 内容中的方括号?

ruby-on-rails - 在 Rails 可安装引擎中添加 Assets 路径?

ruby-on-rails - 如何从 Rails 引擎中初始化 Rails 3+ 应用程序中的自定义 ActiveModel 验证器

ruby-on-rails - 控制 Rails 初始化程序加载顺序(可能需要新的 Rails 初始化 Hook )

ruby-on-rails-3 - Rails Engines--如何绕过命名路由的 main_app

ruby-on-rails - 安装 rails ActiveAdmin 引擎位于可安装引擎内

ruby-on-rails - 如何获取当月创建的记录?