我有一个部分, _flash.html.haml
的Flash消息在局部模板(Rails 3中)
- flash.each do |type, value|
.flash{ :class => type.to_s }
= value
无/不确定。然而,当我这样做:
=render :partial => "flash", :locals => {:flash => flash}
它的工作原理。
为什么部分不能访问Flash消息?
我有一个部分, _flash.html.haml
的Flash消息在局部模板(Rails 3中)
- flash.each do |type, value|
.flash{ :class => type.to_s }
= value
无/不确定。然而,当我这样做:
=render :partial => "flash", :locals => {:flash => flash}
它的工作原理。
为什么部分不能访问Flash消息?
在先前版本的Rails(Rails 2)中,默认的局部变量会查找与父项中的部分名称相同的实例变量。
给出你的例子,因为部分被命名为_flash
它会自动将实例变量flash作为局部传递给部分。因此你可以访问它。此行为在2.3中已被弃用,并且已在Rails 3.0中被删除。
这意味着您必须显式传递所有实例变量,如locals
,即使是flash
,就像您在后一个示例中所写的一样。
<%= render :partial => "flash", :locals => {:flash => flash} %>
这有什么好做flash
每说,flash
是一个实例变量,就像任何其他。
因为你的partial部分被命名为“_flash”,所以你应该有:object本地来指定partial中的变量flash。
更改部分的名字,你将能够里面使用闪光灯,例如:
= render "show_flash_names"
我用= render'layouts/flash_messages'。我喜欢你的解决方案比明确传递当地人更好。 (:locals => {:flash => flash}非常详细 - yuck) – 2011-07-20 19:16:37
+1:只要不将它命名为“flash”,就可以像期望的那样访问Rails flash对象。 – 2011-12-20 22:43:40
这就是答案! – brad 2012-06-06 11:40:15
这也将实现你想要的结果:
<%= render partial: "flash", object: flash %>
的flash
对象正在传递给admin/shared/flash
部分为flash
,因为该部分称为flash
。您可以在任何常规视图中从部分内部访问flash
对象。
每个部分都在一个上下文中呈现,该上下文包含名称与部分名称(不包括前导下划线)相同的隐式局部变量。所以一个_flash.html.haml
部分将always有一个flash
当地哪个阴影ActionView::Base#flash
。如果你没有一个参数传递给部分(通过:locals => {:flash => flash}
或:object => flash
,当地的值就是nil
。
至于建议,你可以重命名的部分,以避免名称冲突,或使用了更详细致电render
。
在我看来,这是一个令人讨厌的Rails错误特性,并且还有I'd like to see it changed。
这是最完整的答案,提供原因和可能的解决方法。我也很欣赏他努力消除这个“特征”中的“惊喜”。 – 2012-10-24 18:11:44
但是'flash'不是父视图中的一个实例变量,它是'ActionView :: Base'上的一个方法,它与辅助方法基本相同。那么为什么在部分调用中不使用'flash'方法呢? – John 2012-09-18 18:14:17
这是因为命名空间的阴影。该部分被命名为flash,因此它将部分委托中的变量名称flash保留为在父模板中闪存ivar,而不管flash是否存在。正如@tothemario所回答的,将其命名为别的东西将会停止名称空间映射。 – Cluster 2013-02-15 15:38:20
@Cluster,我想你只是在想我。有时候我想知道Rails“majic”对于自己的好处不是太神奇。 – guiniveretoo 2013-06-21 19:04:51