部分Flash消息(Rails 3)

时间:2010-06-24 16:21:59

标签: ruby-on-rails-3

我有部分, _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消息?

4 个答案:

答案 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对象,因为您可以在任何常规视图中使用它。