2010-06-24 27 views
25

我有一个部分, _flash.html.haml的Flash消息在局部模板(Rails 3中)

- flash.each do |type, value| 
    .flash{ :class => type.to_s } 
    = value 

无/不确定。然而,当我这样做:

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

它的工作原理。

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

回答

24

在先前版本的Rails(Rails 2)中,默认的局部变量会查找与父项中的部分名称相同的实例变量。

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

这意味着您必须显式传递所有实例变量,如locals,即使是flash,就像您在后一个示例中所写的一样。

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

这有什么好做flash每说,flash是一个实例变量,就像任何其他。

+2

但是'flash'不是父视图中的一个实例变量,它是'ActionView :: Base'上的一个方法,它与辅助方法基本相同。那么为什么在部分调用中不使用'flash'方法呢? – John 2012-09-18 18:14:17

+8

这是因为命名空间的阴影。该部分被命名为flash,因此它将部分委托中的变量名称flash保留为在父模板中闪存ivar,而不管flash是否存在。正如@tothemario所回答的,将其命名为别的东西将会停止名称空间映射。 – Cluster 2013-02-15 15:38:20

+0

@Cluster,我想你只是在想我。有时候我想知道Rails“majic”对于自己的好处不是太神奇。 – guiniveretoo 2013-06-21 19:04:51

22

因为你的partial部分被命名为“_flash”,所以你应该有:object本地来指定partial中的变量flash。

更改部分的名字,你将能够里面使用闪光灯,例如:

= render "show_flash_names" 
+1

我用= render'layouts/flash_messages'。我喜欢你的解决方案比明确传递当地人更好。 (:locals => {:flash => flash}非常详细 - yuck) – 2011-07-20 19:16:37

+2

+1:只要不将它命名为“flash”,就可以像期望的那样访问Rails flash对象。 – 2011-12-20 22:43:40

+0

这就是答案! – brad 2012-06-06 11:40:15

4

这也将实现你想要的结果:

<%= render partial: "flash", object: flash %>

flash对象正在传递给admin/shared/flash部分为flash,因为该部分称为flash。您可以在任何常规视图中从部分内部访问flash对象。

5

每个部分都在一个上下文中呈现,该上下文包含名称与部分名称(不包括前导下划线)相同的隐式局部变量。所以一个_flash.html.haml部分将always有一个flash当地哪个阴影ActionView::Base#flash。如果你没有一个参数传递给部分(通过:locals => {:flash => flash}:object => flash,当地的值就是nil

至于建议,你可以重命名的部分,以避免名称冲突,或使用了更详细致电render

在我看来,这是一个令人讨厌的Rails错误特性,并且还有I'd like to see it changed

+0

这是最完整的答案,提供原因和可能的解决方法。我也很欣赏他努力消除这个“特征”中的“惊喜”。 – 2012-10-24 18:11:44

相关问题