2012-02-26 135 views
1

我試圖渲染不同對象的集合,每個對象的格式都相同。我想保持乾燥,所以我想使用偏色和partial layoutsRails 3和局部佈局

編輯 - 簡要說明:我需要的不是在所有發佈頁面上顯示通用項目,而是在每個項目上顯示通用屬性/字段。這就是爲什麼我需要部分佈局,例如部分佈局,而不是頁面佈局。

我有不同對象的集合:

@publications = Publications.all 
# Publication is the parent class 
# @publications = [ImagePost, VideoPost, TextPost, ...] 

我想呈現列表中的所有出版物。每個出版物都有一些共同的屬性:作者,日期,...我想把這個屬性放在局部佈局

在我看來

因此,渲染收藏,我做的:

<%= render :partial => 'publications', :locals => {:publications => @publications} %> 

在第一級部分views/publications/_publications.html.erb,我圈上的項目,並嘗試呈現在它的部分,並與公共部分的每個項目佈局:

<ul class='publications_list'> 
    <% publications.each do |p| %> 
    <%= render p, :layout => 'publications/publication_layout' %> 
    <% end %> 
</ul> 

的局部佈局,views/publications/_publication_layout.html.erb

<li> 
    <h2><%= link_to publication.title, publication %></h2> 
    ... Other common properties that I want to display on each item, independently of its type ... 
    <p><%= yield %></p> 
</li> 

最後,對於每種對象類型,我都有一個部分(例如, image_posts/_image_post.html.erb等)包含代碼以正確顯示每個。

我的問題:我沒有設法渲染每個出版物的公共局部佈局publication_layout。這個佈局簡單地被rails忽略。每個項目都被正確呈現,但沒有包含公共屬性和<li>標記的這種佈局。

任何關於爲什麼我的局部佈局被忽略的建議?

+1

你有沒有試過指定:局部直接,作爲指南中提出? _「還要注意,在傳遞其他選項(例如:layout)時需要顯式指定:partial。」_。 – 2012-02-29 13:59:18

+0

有關擴展文檔,請參閱[apidoc](http://apidock.com/rails/ActionView/Partials)。 – 2012-02-29 14:04:49

+0

好吧,這可以解釋整個事情......這種行爲真的很奇怪,並不直觀。由於* polymorphic *集合(部分取決於'p'的類型),這對我的情況並不是很方便。任何想法如何以優雅和短的方式檢索每個對象的好部分? – 2012-02-29 14:25:46

回答

2

接聽和變通方法

由於@MarkGuk已經發現在doc這一行:

還要注意的是明確指定:使 其他選項,例如當部分是必需的:佈局。

因此,只是不可能在每個項目的相同部分中呈現多態集合。

解決方法1:我首先嚐試爲每個項目計算部分路徑,將其存儲在模型中以方便起見,並使用良好的佈局渲染每個項目的良好局部。但我意識到,這種方法,我不能引用對象publication裏面的佈置......

<ul class='publications_list'> 
    <% publications.each do |p| %> 
    <% # p.partial = p.class.to_s.underscore.pluralize +'/'+ p.class.to_s.underscore %> 
    <%= render :partial => p.partial, :object => p, :as => :publication, :layout => 'publications/publication_layout' %> 
    <% end %> 
</ul> 

解決方法2: 最後我用嵌套的諧音。

<ul class='publications_list'> 
    <% publications.each do |p| %> 
    <%= render :partial => 'publications/publication_layout', :object => p, :as => :publication %> 
    <% end %> 
</ul> 

並替換yieldrender publication裏面的佈局。

0

我想知道nested layout可以在這裏更好地爲您服務。該指南應該指向你在正確的方向,我發現它十分容易獲得工作,但作爲一個開始:

views/layouts/application.html.erb,改變yield到:

<%= content_for?(:publication_content) ? yield(:publication_content) : yield %> 

消除局部views/publications/_publication.html.erb,而是創建嵌套佈局views/layouts/publication.html.erb

<% content_for :content do %> 
    # Put common items here 
    <%= content_for?(:content) ? yield(:content) : yield %> # this is for specifics 
<% end %> 

<%= render :template => 'layouts/application' %> 

然後具體的佈局可以進一步嵌套或在視圖中,附加標籤根據您的設置的其他規定。

+0

嗯,我想過嵌套的佈局(我知道如何使用它),但1 /我想嘗試爲特定用途設計的部分佈局,2 /我不明白如何讓它爲我工作這裏。更確切地說,我不知道如何重複佈局超過1次才能呈現__collection__而不是單個項目(如您的示例所示)。更精確地說,我再次確定我的集合是* polymorphic *(在面向對象編程的意義上) – 2012-02-26 20:22:07

+0

您可以使用具有嵌套佈局的partial來顯示集合;至少我在我的應用中沒有問題。出版物佈局中的「yield」部分將顯示該視圖上指定的內容,因此您可以非常容易地融入您已經設置的部分系統。嵌套佈局部分主要是您想要在所有發佈頁面上顯示的常用項目的解決方案。 – ellawren 2012-02-26 22:18:34

+0

不,實際上,我沒有得到您的答案和我的問題之間的鏈接;)我需要的不是顯示所有發佈頁面上的公共項目,而是顯示每個項目__on的通用屬性/字段。這就是爲什麼我需要[部分佈局](http://guides.rubyonrails.org/layouts_and_rendering.html#partial-layouts),例如部分佈局,而不是頁面佈局。您的解決方案只是告訴我如何做出版頁面佈局... – 2012-02-27 07:51:04