Ruby on rails 轨道3和部分布局

Ruby on rails 轨道3和部分布局,ruby-on-rails,ruby-on-rails-3,partials,Ruby On Rails,Ruby On Rails 3,Partials,我试图为每个对象以相同的格式呈现不同对象的集合。我想保持干燥,所以我想使用partials和 编辑-简要说明:我需要的不是在所有出版物页面上显示公共项目,而是在每个项目上显示公共属性/字段。这就是为什么我需要局部布局,例如,局部的布局,而不是页面的布局 我有一个不同对象的集合: @publications = Publications.all # Publication is the parent class # @publications = [ImagePost, VideoPost, Te

我试图为每个对象以相同的格式呈现不同对象的集合。我想保持干燥,所以我想使用partials和

编辑-简要说明:我需要的不是在所有出版物页面上显示公共项目,而是在每个项目上显示公共属性/字段。这就是为什么我需要局部布局,例如,局部的布局,而不是页面的布局

我有一个不同对象的集合:

@publications = Publications.all
# Publication is the parent class
# @publications = [ImagePost, VideoPost, TextPost, ...]
我要呈现列表中的所有出版物。每个出版物都有一些共同的属性:作者、日期。。。我想把这个属性放在一个局部布局中

因此,在我看来,要呈现集合,我需要:

<%= render :partial => 'publications', :locals => {:publications => @publications} %>
局部布局,
视图/publications/\u publication\u 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\u posts/\u image\u post.html.erb
    等等),其中包含正确显示每个对象的代码

    我的问题是:我无法在公共局部布局中呈现每个出版物
    publication\u layout
    。rails只会忽略此布局。每个项目都正确呈现,但没有包含公共属性和
  • 标记的布局

    关于我的局部布局被忽略的原因有什么建议吗?

    我想知道a在这里是否能更好地为您服务。指南应该为您指出正确的方向,我发现开始工作非常容易,但首先:

    views/layouts/application.html.erb
    中,将
    yield
    更改为:

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

    然后,根据设置的其余部分,可以进一步嵌套特定布局或在视图中指定附加标记。

    答案和解决方法

    感谢@MarkGuk在文档中发现了这一行:

    还要注意,传递时需要显式指定:partial 其他选项,例如:布局

    因此,不可能简单地为每个项目在同一部分中呈现多态集合

    解决方法1:我首先尝试为每个项目计算部分路径,为了方便起见将其存储在模型中,然后以良好的布局在良好的部分中渲染每个项目。但是我意识到这种方法,我不能引用布局中的对象
    出版物

    <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>
    
      p、 部分,:object=>p,:as=>:publication,:layout=>'publications/publications\u layout'>
    解决方案2: 最后,我使用了嵌套的partials

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

    并将
    yield
    替换为布局内的
    呈现出版物。

    请参见问题和注释


    Hm我考虑过嵌套布局(我知道如何使用它),但1/我想尝试一下为这种特定用途设计的局部布局,2/我不知道如何让它在这里为我工作。更准确地说,我不知道如何重复一个布局超过1次,以便呈现一个集合而不是单个项目(如您的示例所示)。更准确地说,我再次强调我的集合是多态的(在面向对象编程的意义内),您可以使用带有嵌套布局的部分来显示集合;至少在我的应用程序中没有问题。出版物版面中的
    yield
    部分将显示该视图中指定的内容,因此您可以非常轻松地融入已设置的部分系统。嵌套布局部分主要用于解决您希望在所有出版物页面上显示的常见项目。不,真的,我没有得到您的答案和我的问题之间的链接;)我需要的不是在所有发布页面上显示公共项目,而是在每个项目上显示公共属性/字段。这就是为什么我需要,例如,局部的布局,而不是页面的布局。您的解决方案只需告诉我如何进行出版物页面布局……我试图对我的问题进行一些澄清,请重新阅读。您是否尝试按照指南中的建议直接指定:部分?“还请注意,在传递其他选项(如:布局)时,需要显式指定:partial。”。有关扩展文档,请参阅。很好,这可以解释整个问题。。。这种行为真的很奇怪,而且不直观。这对于我的例子来说不是很方便,因为多态集合(部分依赖于
    p
    的类型)。有没有关于如何以优雅而简短的方式检索每个对象的好部分的想法?@MarkGuk因此我找到了解决方法,请参阅我的答案以了解详细信息。谢谢你的贡献。如果你想申请赏金,请回答。
    <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>
    
    <ul class='publications_list'>
      <% publications.each do |p| %>
        <%= render :partial => 'publications/publication_layout', :object => p, :as => :publication %>
      <% end %>
    </ul>