2012-02-26 102 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