优化重复 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 代码的正确方法的主要内容,如果未能解决你的问题,请参考以下文章