Приложение Rails с несколькими макетами страниц - как высушить? - PullRequest
1 голос
/ 22 августа 2010

У меня есть Rails-сайт с базовым макетом из двух колонок. Справа находится боковая панель с разными (скажем так) вертикальными виджетами. В зависимости от того, какую страницу вы посещаете, виджеты могут быть включены, исключены и в другом порядке. Например:

Главная страница (Приложение)

СОДЕРЖАНИЕ СТРАНИЦЫ ...

SIDEBAR

  • Виджет A
  • Виджет B
  • Виджет C

Страница X

СОДЕРЖАНИЕ СТРАНИЦЫ ...

SIDEBAR

  • Виджет D
  • Виджет A
  • Виджет C

Страница Y

СОДЕРЖАНИЕ СТРАНИЦЫ ...

SIDEBAR

  • Виджет E
  • Виджет A
  • Виджет B
  • Виджет C

Сейчас способ отображения виджетов для конкретной страницы не очень СУХОЙ. Я создаю макет для каждой страницы, затем снова и снова копирую и вставляю одни и те же HTML-части и виджеты. Например:

application.html.erb

<%= render :partial => 'shared/html_header' %>

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

    <%= render :partial => "shared/head" %>     

    <body>                        
        <div id="outer">

            <%= render :partial => 'shared/banner' %>
            <%= render :partial => 'shared/nav' %>

            <div id="main">
                <table cellpadding="0" cellspacing="0" border="0" style="width:100%;">
                  <tr style="vertical-align:top;">

                   <td style="width:759px;">
                    <%= render :partial => 'shared/content' %>
                  </td>

                        <td><%= image_tag("spacer.gif", :width => "5") %></td>

                        <td style="width:252px;">
                            <%= render :partial => 'shared/widget_a' %>
                            <%= image_tag("spacer.gif", :height => "10") %>

                            <%= render :partial => 'shared/widget_b' %>
                            <%= image_tag("spacer.gif", :height => "10") %>

                            <%= render :partial => 'shared/widget_c' %>
                            <%= image_tag("spacer.gif", :height => "10") %>

                        </td>
                    </tr>
                </table>
            </div>
            <%= render :partial => 'shared/footer' %>
        </div>
            <%= render :partial => 'shared/user_voice_widget_script' %>
            <%= render :partial => 'shared/google_analytics_script' %>
    </body> 
</html>

Я просто повторяю этот шаблон для других макетов страниц, но с виджетами, специфичными для страницы. Не кажется слишком сухим.

Я думаю, что должен быть более эффективный способ сделать это. Есть предложения?

1 Ответ

7 голосов
/ 22 августа 2010

Вы можете использовать один файл макета, который определяет структуру двух столбцов для всех ваших страниц, а затем использовать помощник Rails content_for для контекстного заполнения вашей боковой панели, в зависимости от посещаемой страницы.Тогда единственная информация, относящаяся к конкретной странице, - это детали боковой панели, а не весь макет, повторяемый снова и снова.

В вашем (одном) макете приложения:

<td style="width:252px;">
  <%= yield :sidebar %>
</td>

Где-то на ваших страницах:

<% content_for :sidebar do %>
  <%= render :partial => 'shared/widget_a' %>
  <%= image_tag("spacer.gif", :height => "10") %>

  ...

<% end %>

Если достаточное количество комбинаций виджетов часто встречается вместе, вы можете рассмотреть возможность объединения их директив render в партиалы и использования их в вашем блоке content_for.

Общая методика описана здесь

...