2010-06-24 31 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

相關問題