shm*_*ael 3 ruby ruby-on-rails
我有一个可能从控制器渲染或从另一个视图部分渲染的视图.
在我读过的所有代码中,控制器分配一个实例变量"@item",然后调用视图.另一方面,当将其呈现为部分时,它接收参数"item".
所以,我的所有观点都以这种方式启动:
item ||= @item
Run Code Online (Sandbox Code Playgroud)
非常干燥.我错过了更好的方法吗?
@item是一个实例变量 - 它对整个类实例可见.出于Rails的观点,您可以将它们视为"全局"变量.如果你有,例如:
class Foo
def initialize
@bar = "Yay!"
end
def show_bar
puts @bar
end
end
Run Code Online (Sandbox Code Playgroud)
然后调用Foo.new.show_bar将打印Yay!,因为该@bar变量对整个实例可见.
item另一方面是局部变量.它仅在其定义的范围内可见.Rails使用实例变量在控制器方法和视图之间共享数据.
通常,partials接收局部变量,因为它们不被假定与标准视图之类的控制器方法处于1:1关系.也就是说,设计良好的部分不假设存在任何实例("全局")变量.假设由控制器方法设置的数据将呈现完整视图; 假设部分由显式传递给它们的数据呈现.
既然你正在使用这个视图,我建议你将它重构为"只是部分,女士"作品和全视图包装片.因此,您的完整视图可能很简单:
<%=render :partial => "item_partial", :locals => {:item => @item} %>
Run Code Online (Sandbox Code Playgroud)
然后,您的item_partial将始终使用item而不是@item.
这使您能够轻松地打包所有可重复使用的内容,然后根据需要为完整视图添加额外的"绒毛".
| 归档时间: |
|
| 查看次数: |
1217 次 |
| 最近记录: |