Rails 3 и частичные макеты - PullRequest
1 голос
/ 26 февраля 2012

Я пытаюсь отобразить коллекцию различных объектов в одном формате для каждого. Я хочу сохранить это СУХОЙ, поэтому я хочу использовать частичные и частичные макеты .

Редактировать - краткое пояснение: мне нужно не отображать общие элементы на всех страницах публикации, а отображать общие свойства / поля для каждого элемента. Вот почему мне нужны частичные макеты, например макет для частичного, а не макет для страницы.

У меня есть коллекция различных предметов:

@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. Этот макет просто игнорируется рельсами. Каждый элемент отображается правильно, но без этого макета, который включает в себя общие свойства и тег <li>.

Есть ли какие-либо предложения о том, почему мой частичный макет игнорируется?

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012

ОТВЕТ И РАБОТЫ

Благодаря @MarkGuk обнаружил эту строку в документе:

Также обратите внимание, что явно указывается: частичное требуется, когдапередавая дополнительные параметры, такие как: макет.

Так что просто невозможно отобразить полиморфную коллекцию внутри одного и того же фрагмента для каждого элемента.

Обходной путь 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>

и заменили yield на render publication внутри макета.

0 голосов
/ 01 марта 2012
0 голосов
/ 26 февраля 2012

Интересно, может ли вложенная раскладка лучше вам здесь помочь?Руководство должно указать вам правильное направление, и мне было легко начать работу, но для начала:

В 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' %>

Затем конкретные макеты могут быть дополнительно вложены или указаны с помощью дополнительных тегов в представлении, в зависимости от остальной части вашей настройки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...