在Rails中合并实例变量(将数据从控制器传递到视图)的最佳方法是什么?

use*_*662 5 ruby ruby-on-rails object instance-variables ruby-on-rails-3

我在Rails 3应用程序中有一个详细信息页面,它有几个实例变量.例如,我的视图有以下实例:

@product
@program
@action
...etc...
Run Code Online (Sandbox Code Playgroud)

其中一些是单个字符串,一些是数组(来自外部API的请求的结果).总的来说,数据来自至少3个型号.

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

Details.product
Details.program
Details.action
Run Code Online (Sandbox Code Playgroud)

非常感谢!

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

wee*_*HIS 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
Run Code Online (Sandbox Code Playgroud)