5

我在 Rails 3 应用程序中有一个详细信息页面,其中包含多个实例变量。例如,我的视图有以下实例:

@product
@program
@action
...etc...

其中一些是单个字符串,一些是数组(来自外部 API 的请求的结果)。总体而言,数据来自至少 3 个模型。

我的问题是:合并实例变量的最佳方法是什么,以便我的视图和控制器看起来更干净(不牺牲可读性)?我知道这个问题是开放式的,每个人都有自己的喜好,但是有哪些选择呢?我正在考虑将实例变量组合成一个对象,所以前面的代码变成了这样:

Details.product
Details.program
Details.action

非常感谢!

更新:走对象路线,有没有实际实现它的好例子(github、博客文章)?

4

3 回答 3

2

在我看来,清理控制器操作的最佳方法是在那里分配尽可能少的实例变量。在实践中,我尝试只在 action/before_filters 中分配实例变量,这些变量直接派生自传递给它的参数。此外,一般来说,我会尽量将尽可能多的实例变量分配推送到 before_filters 以保持动作苗条。

但是在动作中减少实例变量分配的最好方法是使用视图助手。例如,如果您当前在用于输出某些 div 的操作中分配实例变量,则只需使用视图助手直接执行输出,而无需将对象传递给视图。

这是控制器上的 before_filter 示例:

before_filter :assign_variables, :only => :show

def show; end

private
def assign_variables
  @product = Product.find(params[:product_id])
  @program = Program.find(params[:program_id])
  @action = Action.find(params[:action_id])
end
于 2012-09-14T03:16:47.520 回答
2

I would suggest not using instance variables at all and go with the decent exposure gem instead.

https://github.com/voxdolo/decent_exposure

http://railscasts.com/episodes/259-decent-exposure

于 2012-09-14T09:13:29.260 回答
1

每当您发现自己在控制器操作中有多个实例变量时,最好使用演示者模式。

该视频详细解释了所有内容 “Ruby on Rails - Presenters & Decorators”

于 2016-05-15T05:46:04.270 回答