2009-12-23 115 views
2

我正在構建一個示例站點來熟悉RoR。我遵循了「使用Rails進行敏捷Web開發」一書,現在我正在試驗並將其用作參考,但是我一直無法找到解決問題的答案。呈現其他控制器的模板(Ruby on Rails)

我有兩個興趣模型,一個是超市和另一個超市。顯然,一家超市連鎖店擁有一堆超市。我想要做的是獲得單個超市連鎖店的基本「展示」頁面,以顯示屬於它的超市列表。

我也不想重複自己(因爲顯然這是一件非常糟糕的事情),所以我想我可以使用「渲染」將超市的index.html.erb插入到supermarketchain/show.html.erb頁面,如下所示:

<%= render :template => 'supermarkets/index' %> 

但是,這會在頁面上產生零輸出。

我的下一個方法是使這一部分:

<div id="supermarket-list"> 
    <h1><%= I18n.t "supermarket.title" %></h1> 

    <table> 
    <% for s in @supermarkets %> 
    <tr class="<%= cycle('list-line-odd', 'list-line-even') %>"> 
     <td> 
      <%= s.supermarketchain.name %> 
     </td> 
     <td> 
      <%= s.address %> 
     </td> 
     <td class="list-actions"> 
      <%= link_to I18n.t("general.show"), s%> <br/> 
      <%= link_to I18n.t("general.edit"), edit_supermarket_path(s) %> <br /> 
      <%= link_to I18n.t("general.delete"), s, :confirm => I18n.t("general.confirmation"), :method => :delete %> 
     </td> 
    </tr> 
    <%end%> 
    </table> 
</div> 

然後用:

<% @supermarkets = Supermarket.all %> 

<%= render :partial => 'supermarkets/supermarket' %> 

要插入的supermarketchain的節目頁面上。

我想知道的是這是否是一種好的做法。在我想要顯示的是超級市場控制器的「索引」操作的確切結果時,初始化變量供部分使用時似乎很奇怪。註釋?

請查詢任何需要的說明。

回答

0

可以,而是做

<%= render :partial => 'supermarket', :collection => Supermarket.all, :as => :s %> 

和部分將一次每家超市被調用,與變量名s

+0

謝謝! 好的,聽起來好多了。但是,對於我希望在其他模型頁面中包含的每個模型都進行部分分析,是否是一個好主意?我的主要問題是設計,而不是如何調用渲染。 – FrontierPsycho 2009-12-23 23:23:30

+0

其實,仔細觀察,你的建議要求我改變我的偏好來操作單個項目,我相信,目前它需要一個集合並迭代它。我試了一下,但沒有奏效。 你認爲我更改這樣的代碼更好嗎? – FrontierPsycho 2009-12-23 23:27:38

+0

我認爲你應該有個人超市的觀點。 *但是*您不必替換當前的「多重」視圖。相反,您可以在「多個」版本中使用單一視圖。然後你可以在你的代碼中使用它們。 – kikito 2009-12-24 15:36:54

0

我一直在努力解決這個問題,但發現它不是真正支持作爲呈現部分的方法,並且由於我通常信任Rails開發人員約定,所以我決定這可能不是一個好主意。

我不認爲在那裏使用模板會起作用,你可以使用render_to_string,但這看起來很駭人,並且可能會在未來導致你更頭痛。

另外,如果你想呈現一個集合,最好的辦法是設置實例變量的控制行動,而不是在視圖中..

def index 
    @supermarkets = Supermarket.all 
end 

然後在視圖index.html.erb,請致電:

<%= render @supermarkets %> 

然後將所述陣列中的每個成員迭代,並呈現views/supermarkets/_supermarket.html.erb每個,以「超市」是在部分可用的當前成員。

<%= supermarket.name %><br /> 
<%= supermarket.address %> 

我擔心很多這樣的渲染性能,而只是保持對日誌和時代的眼睛,我想呈現對做手工原視圖中的時間大致相同。

+0

問題是,_supermarket.html.erb屬於超市模型和我試圖把它渲染到另一個(超市鏈)的頁面,因此它們位於不同的文件夾下。我嘗試了你的建議,但我得到了一個錯誤,Rails告訴我它找不到「supermarketchain/_supermarket.html.erb」,這很自然,因爲該文件位於超市/ _supermarket.html.erb。 關於將代碼移入控制器的好處。 – FrontierPsycho 2009-12-24 00:47:46

0

好的,如果我得到這個權利,你有一個鏈的列表,每個鏈都有一個超市的列表,對嗎?你有兩個模型之間的關聯設置?因爲如果你有的話,那隻會簡化一些東西。在這種情況下,假設您將模型從「supermarketchains」重命名爲「chain」(清除任何混淆)。超市

而在超市模式:你可以像這樣>

的has_many模型相關聯。

belongs_to的:鏈

從那裏,它只是循環一樣的問題:

<% if chain.supermarkets.count > 0 %> 

#Do stuff. 

<% end %> 

這就是說,如果你還沒有安裝控制器來拉這些信息,可能需要額外的工作。

+0

我已經這樣做了,但是這可以被認爲是重複我自己的一種情況,我正在尋找一種方法來避免它:)我只是在探索是否有一種「Rails」方式來執行此操作,即Approved和經過測試。 – FrontierPsycho 2009-12-24 00:43:54

1

在Rails中渲染來自其他控制器的部分是完全正確的。通常如果一個部分不屬於任何一個特定的控制器,它將被放入app/views/shared。在這種情況下,儘管我認爲保持超市控制器的局部性是有意義的。

下面介紹如何爲兩個部分使用相同的部分supermarkets/_supermarket.html.erb。部分將具有可用的本地變量supermarket

# supermarketchain/show.html.erb 
<%= render :partial => "supermarkets/supermarket", :collection => @supermarketchain.supermarkets %> 

# supermarkets/show.html.erb 
<%= render :partial => "supermarket", :object => @supermarket %>