部分Flash消息(Rails 3)

Jam*_*ong 25 ruby-on-rails-3

我有部分, _flash.html.haml

- flash.each do |type, value|
  .flash{ :class => type.to_s }
    = value 
Run Code Online (Sandbox Code Playgroud)

我正在使用的视图渲染

=render :partial => "flash"

哪个抱怨flash哈希值为nil/undefined.但是,当我这样做时:

=render :partial => "flash", :locals => {:flash => flash}

有用.

为什么部分不能访问flash消息?

maz*_*maz 24

在以前版本的Rails(Rails 2)中,默认局部变量将查找与父级中的partial相同的实例变量.

鉴于你的例子,因为部分被命名,_flash它会自动将实例变量flash作为局部传递给局部.因此,您可以访问它.此行为在2.3中已弃用,并已在Rails 3.0中删除.

这意味着,你总是要明确地传递所有的实例变量locals,甚至flash,就像你在后面的例子中写道.

<%= render :partial => "flash", :locals => {:flash => flash} %>

这与flash每个说法无关,flash是一个实例变量,就像任何其他变量一样.

  • 这是因为命名空间阴影.部分名为flash,因此它保留变量名flash在partial模板中委托给父模板中的flash ivar,无论flash是否存在.正如@tothemario回答的那样,将其命名为其他将停止命名空间阴影. (8认同)
  • 但是`flash`不是父视图中的实例变量,它是`ActionView :: Base`上的一个方法,它与辅助方法基本相同.那么为什么部分调用中没有`flash`同样的方法呢? (2认同)

tot*_*rio 22

因为你的partial被命名为"_flash",你应该有:object local来指定partial里面的变量flash.

更改部分名称,您就可以在内部使用闪光灯,例如:

= render "show_flash_names"
Run Code Online (Sandbox Code Playgroud)

  • 对此+1:只是不要将其命名为"flash",您可以按照预期访问Rails flash对象. (2认同)

Joh*_*ohn 5

每个partial都在一个上下文中呈现,该上下文包含一个隐式局部变量,其名称是partial的变量(不包括前导下划线).因此,一个_flash.html.haml部分将永远有一个flash地方,其阴影ActionView::Base#flash.如果你没有将参数传递给partial(通过:locals => {:flash => flash}或者:object => flash,本地的值就是简单的nil.

根据建议,您可以重命名部分以避免名称冲突,或使用更详细的调用render.

在我看来,这是一个恼人的Rails错误,我希望看到它改变了.