【发布时间】:2012-03-16 09:18:54
【问题描述】:
我正在尝试为每个对象以相同的格式呈现不同对象的集合。我想让它保持干燥,所以我想使用部分和partial layouts。
编辑 - 简要说明:我需要的不是在所有发布页面上显示通用项目,而是在每个项目上显示通用属性/字段。这就是为什么我需要部分布局,例如部分布局,而不是页面布局。
我有一个不同对象的集合:
@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> 标记的布局。
关于为什么我的部分布局被忽略的任何建议?
【问题讨论】:
-
您是否尝试按照指南建议的方式直接指定 :partial ? “另请注意,在传递附加选项(例如 :layout)时需要显式指定 :partial。”.
-
请参阅apidoc 了解扩展文档。
-
很好,这可以解释整个事情......这种行为真的很奇怪而且不直观。这对我来说不是很方便,因为 polymorphic 集合(部分取决于
p的类型)。关于如何以优雅而简短的方式检索每个对象的好部分的任何想法? -
@MarkGuk 所以我找到了解决方法,详情请参阅我的答案。感谢您的贡献。如果您想获得赏金,请回答。
标签: ruby-on-rails ruby-on-rails-3 partials