我有部分,
_flash.html.haml
- flash.each do |type, value|
.flash{ :class => type.to_s }
= value
我正在使用
从视图中渲染 =render :partial => "flash"
抱怨flash哈希值为nil / undefined。但是,当我这样做时:
=render :partial => "flash", :locals => {:flash => flash}
有效。
为什么部分人不能访问flash消息?
答案 0 :(得分:24)
在以前版本的Rails(Rails 2)中,默认局部变量将查找与父级中的partial相同名称的实例变量。
鉴于您的示例,因为partial命名为_flash
,它会自动将实例变量flash作为局部传递给partial。因此,您可以访问它。此行为在2.3中已弃用,并已在Rails 3.0中删除。
这意味着您必须将所有实例变量显式传递为locals
,甚至flash
,就像您在后一个示例中所写的一样。
<%= render :partial => "flash", :locals => {:flash => flash} %>
这与flash
无关,flash
是一个实例变量,与其他任何变量一样。
答案 1 :(得分:22)
因为你的partial被命名为“_flash”,所以你应该使用:object local来指定部分内的变量flash。
更改部分名称,您可以在内部使用闪光灯,例如:
= render "show_flash_names"
答案 2 :(得分:5)
每个partial都在一个上下文中呈现,该上下文包含一个隐式局部变量,其名称是partial的变量(不包括前导下划线)。因此,_flash.html.haml
部分always会有一个flash
本地影子ActionView::Base#flash
。如果您没有将参数传递给部分(通过:locals => {:flash => flash}
或:object => flash
,则本地的值只是nil
。
根据建议,您可以重命名部分以避免名称冲突,或使用对render
的更详细的调用。
在我看来,这是一个恼人的Rails错误,I'd like to see it changed。
答案 3 :(得分:4)
这也将达到您想要的效果:
<%= render partial: "flash", object: flash %>
flash
对象作为admin/shared/flash
传递给flash
部分,因为部分称为flash
。您可以从部分内部访问flash
对象,因为您可以在任何常规视图中使用它。