我有一個部分, _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