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

Posted

技术标签:

【中文标题】优化重复 Rails 代码的正确方法【英文标题】:Correct way to optimize repeated Rails code 【发布时间】:2009-08-22 17:23:38 【问题描述】:

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

目前我只向单个模型(及其视图和控制器)介绍了 cmets、投票、标签等。但是,既然我对结果感到满意,我想从一个模型的特定 MVC 中删除这个通用功能,并允许从所有其他模型访问它。

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

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

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

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

【问题讨论】:

【参考方案1】:

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

    正确的方法是创建一个 cmets 控制器,并将其嵌套到您的模型中,从而提供如下所示的宁静路线:/mymodelname/1/cmets。 制作此类控制器的一种简单方法是使用inherited_resources plugin。 向下滚动到“多态属于”部分 - 有一个 cmets 控制器示例

【讨论】:

【参考方案2】:

对于重复的模型代码,把它放在lib目录下的一个模块中。

对于控制器代码,将您的重复代码放入 ApplicationController。

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

【讨论】:

对于控制器代码我也可以把它放在一个模块中吗? (例如用于模型的 CommonModel 和用于控制器的 CommonController?)我的一些 Classess 不需要额外的控制器方法。

以上是关于优化重复 Rails 代码的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

日历中的重复事件 - Rails

我们如何避免控制器中方法的重复/重复 - RAILS 3+

在to_json方法中Rails“参数数量错误(1代表0)”[重复]

C ++编译器优化和短路评估[重复]

如何在rails中编写JSON API的测试用例[重复]

SQL优化之正确去重