正确的方法来优化重复的Rails代码

时间:2009-08-22 17:23:39

标签: ruby-on-rails design-patterns dry

我有一个Rails应用程序,它有几个模型 - 视图 - 控制器,它们具有一些相似的特性,例如5个不同的模型可以被评论,投票或标记,我也大量使用外部插件。

目前,我只对单个模型(及其视图和控制器)引入了评论,投票,标签等。但是,现在我对结果很满意,我想从一个模型的特定MVC中删除这个通用功能,并允许从所有其他模型访问它。

在我开始这样做之前的一些问题(也许一些一般的建议也会很棒):

1 - 我应该怎么做?我在想在“lib”目录中创建一个模块(它与mixin类相同吗?)然后将可重用的视图代码移动到公共部分。控制器代码怎么样?

2 - 当我在第一个模型的编码过程中学习Ruby on Rails时,我采用了一种可能不正确的方法来向控制器添加一堆方法。我有一个添加注释(addcomment),添加投票(addvote)等的方法。所有这些方法都需要通过:collection进行非标准(非RESTful)路由。根据我的理解,正确的方法是将注释控制器功能移动到自己的控制器并通过标准RESTful路由进行访问。这是我应该做的吗?

3 - 许多插件(例如act_as_commentable)没有明确要求加载模块,只是模型中某处的“act_as_commentable”行。我可以使用这样的东西来实现我的常用功能吗?它是如何工作的?

2 个答案:

答案 0 :(得分:3)

  1. 一种简单的方法是将代码拆分为模块并使用mixin。 更好的方法是为您的公共代码编写自己的插件..例如act_as_commentable 你可以在这里了解它:http://guides.rubyonrails.org/plugins.html

  2. 正确的方法是做一个注释控制器,让它嵌套到你的模型中,给出一个像这样的宁静路径:/ mymodelname / 1 / comments。 制作此类控制器的简便方法是使用inherited_resources plugin。 向下滚动到“Polymorphic belongs to”部分 - 有一个注释控制器示例

答案 1 :(得分:2)

对于重复的模型代码,将其放在lib目录中的模块中。

对于控制器代码,将重复的代码放在ApplicationController中。

对于您的视图代码,请使用partials。