Ruby / Rails:视图中“@item”和“item”之间的区别

时间:2010-08-13 16:18:26

标签: ruby-on-rails ruby

我有一个可以从控制器渲染或从另一个视图渲染的视图。

在我读过的所有代码中,控制器分配一个实例变量“@item”,然后调用视图。另一方面,当将其渲染为局部时,它会接收参数“item”。

所以,我的所有观点都以这种方式启动:

item ||= @item

非常干燥。我错过了更好的方式吗?

1 个答案:

答案 0 :(得分:5)

@item是一个实例变量 - 它对整个类实例可见。出于Rails的观点,您可以将它们视为“全局”变量。如果你有,例如:

class Foo
  def initialize
    @bar = "Yay!"
  end

  def show_bar
    puts @bar
  end
end

然后调用Foo.new.show_bar将打印Yay!,因为@bar变量对整个实例可见。

另一方面,

item是一个局部变量。它仅在其定义的范围内可见.Rails使用实例变量在控制器方法和视图之间共享数据。

通常,partials接收局部变量,因为它们不被假定为与标准视图一样的控制器方法的1:1关系。也就是说,设计良好的部分不假设存在任何实例(“全局”)变量。假设由控制器方法设置的数据将呈现完整视图;假设部分由显式传递给它们的数据呈现。

由于你同时使用这个视图,我建议你把它重构成“只是部分,女士”的作品和一个完整的视图包装片。因此,您的完整视图可能非常简单:

<%=render :partial => "item_partial", :locals => {:item => @item} %>

然后,您的item_partial将始终使用item而不是@item

这使您能够轻松地打包所有可重复使用的内容,然后根据需要为完整视图添加额外的“绒毛”。