2012-02-26 3 views
1

Я пытаюсь отобразить коллекцию разных объектов в одном формате для каждого. Я хочу сохранить его СУХОЙ, поэтому я хочу использовать частичные и partial layouts.Rails 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. Этот макет просто игнорируется рельсами. Каждый элемент отображается правильно, но без этого макета, который включает общие свойства и тег <li>.

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

+1

ли вы пытались указать: частично напрямую, как в вашем руководстве предложены? _ «Также обратите внимание, что при передаче дополнительных параметров, таких как: layout., Требуется явно указывать: partial. –

+0

См. [Apidoc] (http://apidock.com/rails/ActionView/Partials) для расширенной документации. –

+0

Хорошо заметили, это может объяснить все это ... Это поведение действительно странно и не интуитивно. И это не очень удобно для моего случая из-за * полиморфной * коллекции (частичная зависимость от типа 'p'). Любая идея о том, как получить хороший частичный для каждого объекта элегантный и короткий путь? –

ответ

2

ANSWER и обходных пути

Благодаря @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

Интересно, может ли здесь 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 * (по смыслу объектно-ориентированного программирования) –

+0

Вы можете использовать частичные файлы с вложенными макетами для отображения коллекции; по крайней мере, у меня не было проблем с этим в моем приложении. Часть 'yield' в макете публикации покажет все, что указано в этом представлении, поэтому вы можете легко смешать в частичной системе, которую вы уже создали. Вложенная часть макета - это в основном решение для общих элементов, которые вы хотите показать на всех страницах публикации. – ellawren

+0

Нет, действительно, я не получаю связь между вашим ответом и моим вопросом;) Мне нужно не показывать общие элементы на всех страницах публикации, а отображать общие свойства/поля __on каждого элемента__. Вот почему мне нужны [частичные макеты] (http://guides.rubyonrails.org/layouts_and_rendering.html#partial-layouts), например. макет для частичного, а не макет страницы. Ваше решение просто подскажите, как сделать макет страницы публикации ... –

Смежные вопросы