2011-09-06 102 views
9

我遇到了一個奇怪的,我不能解釋有關Rails 3和渲染局部佈局(從控制器)。我希望有人能夠對發生的事情提供一點見解。Rails 3 vs 2.3.5渲染怪異與部分和:佈局

首先,我們將這個控制器稱爲「傳統」控制器。它已經存在了很長一段時間,並且做了很多錯誤的事情,但我現在不想重構它,所以我試圖找到方法來處理我們所擁有的。

new動作是這樣的(在BarsController

def new 
    if something 
    render :partial => "foo", :layout => "bars" 
    elsif something_else 
    render :partial => "foo2", :layout => "bars" 
    elsif something_else_else 
    render :partial => "foo3", :layout => "bars" 
    else 
    render :partial => "foo4", :layout => "bars" 
end 

現在,在Rails的2.3.5,這個工作得很好。它會在適當的佈局內渲染適當的部分 - 我意識到佈局選項在這裏是多餘的,因爲它將默認爲酒吧佈局。當我們升級到Rails 3.0.x的,我們開始收到錯誤信息如下:

Missing partial layouts/bars with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html] 

顯然layouts/bars.html.erb文件並且一直在那裏,所以我無法弄清楚。我能夠用:layout => false進行渲染,但這當然不起作用。最後,我想通了,如果我請執行下列操作的,它的工作原理:

1)重命名我的佈局_bars.html.erb而不是bars.html.erb和:

render :partial => 'foo2', :layout => 'bars'

2)保持我的佈局bars.html.erb(什麼我想)和:

render '_foo2' # :partial option is redundant here anyway


好像使用:partial選項代替字符串,因爲第一個參數導致rails將_name.html.erb約定應用於partiallayout。如果我自己插入下劃線,它會回落到我預期的行爲上,而不是在版面名稱的前面加上_

有誰知道這是爲什麼?


編輯好了,不知道我怎麼錯過了這個......但這裏的東西在做這個提及文檔。看起來好像它自2.3.8開始就已經存在了,也許它在2.3.5(我們正在運行的版本)中做了不同的處理?

3.4.3部分佈局

的部分可以使用自己的佈局文件,就像一個視圖可以使用 佈局。例如,您可以調用的部分是這樣的:

<%=渲染「link_area」:佈局=>「graybar」%>這將尋找一個 部分名爲_link_area.html.erb和使用使它佈局 _graybar.html.erb。請注意,部分的佈局遵循相同的 前導 - 下劃線命名爲常規部分,並放置在 相同的文件夾中,其文件屬於它們的局部文件夾(不在主文件夾 佈局文件夾中)。


+0

如果您通過:object或:locals傳遞參數給partials,那麼這將需要更多的代碼mods,因爲這些參數不適用於模板。我希望他們沒有改變行爲...... – farhadf

回答

15

下面是我自己的答案基於什麼的問題我上面編輯:

由於Rails的2.3.8,它會出現,就像渲染部分與render :partial => 'foo', :layout => 'bars'時的默認行爲期望「部分佈局」文件以及部分視圖文件。在這種情況下,會期望

app/views/_foo.html.erb以及app/views/layouts/_bars.html.erb

對於任何人遇到從Rails的2.3.5這個問題升級,這裏是我發現有衝擊最少的解決方案:

render '_foo', :layout => 'bars'

此解決方案不假定您正在渲染部分,因此不期望部分佈局。另一種選擇將是您的佈局複製到

app/views/layouts/_bars.html.erb

,並使用

render :partial => 'foo', :layouts => 'bars'

,但導致一些代碼重複。

鋼軌2.3.8+ DOC關於這:

3.4.3部分佈局

的部分可以使用其自己的佈局文件,就如同一個視圖可以使用 佈局。例如,您可以調用的部分是這樣的:

<%=渲染「link_area」:佈局=>「graybar」%>這將尋找一個 部分名爲_link_area.html.erb和使用使它佈局 _graybar.html.erb。請注意,部分的佈局遵循相同的 前導 - 下劃線命名爲常規部分,並放置在 相同的文件夾中,其文件屬於它們的局部文件夾(不在主文件夾 佈局文件夾中)。

+0

非常有用,謝謝分享! – Rubytastic