2013-05-02 153 views
31

我有一個控制器,可對htmljs作出響應。 html視圖呈現整個頁面(包括頁眉和頁腳),而js僅替換#main。除了頁眉和頁腳,這兩種格式都呈現相同的內容。我能得到這個效果有三個文件:Rails:渲染視圖(不是部分)從視圖內

_show.html.erb 
<div>Content!</div> 

show.html.erb 
<%= render "show" %> 

show.js.erb 
$("#main").fadeIn("<%= escape_javascript(render 'show') %>"); 

這工作,但如果我並不需要一個單獨的_show部分我更喜歡。不幸的是,這並不工作:

show.html.erb 
<div>Content!</div> 

show.js.erb 
$("#main").fadeIn("<%= escape_javascript(render 'show') %>"); 

鐵軌將尋找show部分,而不是實際的看法。

有沒有辦法讓Rails尋找視圖文件,而不是部分?

+3

你可以使用': F ile'選項,例如':file =>'show''。渲染助手會隱式地將'render'yourview''的字符串參數變成'render:partial =>'yourview''。然而,你將遇到的問題是,js操作中的查找上下文將會解析js版本的「show」,可能會導致無限循環或其他問題。 – numbers1311407 2013-05-02 00:42:38

+0

謝天謝地,它不會循環。至少,還沒有。現在我得到一個「缺少模板」的錯誤。看起來它甚至無法找到自己。 – nullnullnull 2013-05-02 00:46:53

+1

在另一個視圖內渲染非局部視圖並不完全是Rails Way™。您目前的解決方案可能會更好。如果你對命名感到奇怪,請將它重命名爲_body。在這種情況下你將看到的常見事物是'render(@resource)',它變成了部分路徑,例如'資源/ _resource'。 – numbers1311407 2013-05-02 00:54:36

回答

23

在另一個視圖內渲染非局部視圖並不完全是Rails Way™。您目前的解決方案可能更好,而且不是一種不常見的方法。如果您覺得部分名稱與動作相同,您可以將其重命名爲_body或其他適當的名稱。

但是,如果您的視圖可以共享,就像在這種情況下可以共享一樣,您可以將其設置爲佈局。

這有助於事實:如果沒有js模板存在,Rails將爲js操作呈現一個html模板,但與最不出意外的原則相反。這意味着你可以同時刪除JS模板,和部分,且只需要創建一個題爲佈局,例如,fadein.js.erb

# yourviews/show.html.erb 
<div>Content!</div> 

# layouts/fadein.js.erb 
$("#main").fadeIn("<%= escape_javascript(yield) %>"); 

# YourController.rb 
def show 
    # ... 
    respond_to do |wants| 
    wants.html 
    wants.js { render :layout => "fadein" } 
    end 
end 
+3

非常感謝。該解決方案將三個文件('show.html.erb','show.js.erb'和'_show.html.erb')合併爲一個'show.html.erb'。我可以將其應用於模型和動作,並且仍然只需要一個'layouts/fadein.js.erb'文件。輝煌! – nullnullnull 2013-05-02 15:48:46

+0

這真的很好!非常感謝。我只是有一個問題,我無法得到這個工作的「創建」的情況下,表單提交應該將我重定向到我剛剛創建的記錄。我在form_for中添加了remote:true,但它搜索創建模板,即使我已經完成了JS的respond_to以指向佈局JS文件。有小費嗎?謝謝。 – Kopty 2013-07-27 14:15:24

+0

@Kopty它仍然在javascript佈局中呈現模板,如HTML。所以它仍然會像往常一樣尋找一個創建模板,除非你不告訴它。如果你想渲染展示模板,你可以做一些像'render:show,:layout =>「fadein」' – numbers1311407 2013-07-28 18:10:31

9

這不是一個好的做法,你可以通過評論看到。導軌具有概念視圖,部分佈局。也就是說,這個視圖是唯一應該只使用一次的視圖。所以我的建議是:

  1. 如果你覺得以上的附加視圖可以將您的當前視圖中進行渲染,你最有可能尋找佈局
  2. 如果你覺得你的觀點一個應在許多網頁呈現,你正在尋找一個部分
  3. 如果這種觀點應該只渲染一個額外的觀點裏面,而視圖應該只對當前視圖中呈現,你可以挑選任何上述的或都不是 - 就是這樣,使用單個文件
13

像其他人所說的,呈現另一種非局部視圖的另一個觀點是「不導軌方式」,然而,如果你仍然堅持做下去,一個方法是:

<%= render :file => '<replace with relative/absolute path>' %> 
1

你只需要一個上下文傳遞到您的render方法:

<%= render :template => "show" -%>