我有一个可以从控制器渲染或从另一个视图渲染的视图。
在我读过的所有代码中,控制器分配一个实例变量“@item”,然后调用视图。另一方面,当将其渲染为局部时,它会接收参数“item”。
所以,我的所有观点都以这种方式启动:
item ||= @item
非常干燥。我错过了更好的方式吗?
答案 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
。
这使您能够轻松地打包所有可重复使用的内容,然后根据需要为完整视图添加额外的“绒毛”。