Rails: несколько макетов с похожим кодом и структурой - СУХОЙ? - PullRequest
0 голосов
/ 14 августа 2011

Приведенный ниже код представления немного многословен, поэтому позвольте мне сначала сформулировать мою проблему и вопрос.У меня есть несколько макетов с несколько отличным кодом в каждом.В настоящее время я пытался ограничить любую избыточность за счет использования партиалов.Тем не менее, я все еще задаюсь вопросом, может ли это быть более сухим.Очевидно, это один из основных принципов, чтобы все было как можно более СУХИМЫМ, но мне интересно, сколько усилий стоит в некоторых случаях, когда просто быть последовательным (даже если это не СУХОЙ) по-прежнему дает вам необходимую эффективность и ремонтопригодность.Итак, учитывая это, что бы вы порекомендовали?Кстати, моя среда - Rails 2.3.12.

# LAYOUT #1

<%= render :partial => 'shared/html_header' %>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <%= render :partial => "shared/head" %>           
  <body>
    <%= render :partial => "shared/announcements" %>       
    <div id="outer">
      <%= render :partial => 'shared/banner' %>
      <%= render :partial => 'shared/nav' %>
      <div id="main">          
        <table cellpadding="0" cellspacing="0">
          <tr>
            <td>
              <%= render :partial => 'shared/content' %>
            </td>
            <td><%= spacer_img(:width => 10) %></td>
            <td>
              <%= render(:partial => 'shared/sidebar_a', :locals => {:box_color => 'greenBox'}) %>
              <%= render(:partial => 'shared/sidebar_b', :locals => {:box_color => 'blueBox'}) %>
              <%= render(:partial => 'shared/sidebar_c', :locals => {:box_color => 'redBox'}) %>
            </td>
          </tr>
        </table>
      </div>
      <%= render :partial => 'shared/footer' %>
    </div>
    <%= render :partial => 'shared/google_analytics_script' %>
  </body>
</html>

# LAYOUT #2

<%= render :partial => 'shared/html_header' %>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <%= render :partial => "shared/head" %>
<body>
  <%= render :partial => "shared/announcements" %>
  <div id="outer">
    <%= render :partial => 'shared/banner' %>
    <%= render :partial => 'shared/nav' %>
    <div id="main">
      <table cellpadding="0" cellspacing="0">
        <tr>
          <td>
            <%= render :partial => 'shared/enticement_rendering' %>
            <%= render :partial => 'shared/content' %>
          </td>
          <td><%= spacer_img(:width => 5) %></td>
          <td>
            <%= render(:partial => 'shared/sidebar_x', :locals => {:box_color => 'greenBox'}) %>
            <%= render(:partial => 'shared/sidebar_y', :locals => {:box_color => 'blueBox'}) %>
            <%= render(:partial => 'shared/sidebar_z', :locals => {:box_color => 'redBox'}) %>
          </td>
        </tr>
      </table>
    </div>
    <%= render :partial => 'shared/footer' %>
  </div>
    <%= update_lb_javascript %>
    <%= render :partial => 'shared/google_analytics_script' %>
  </body>   
</html>

1 Ответ

2 голосов
/ 14 августа 2011

Кажется, единственное, что меняется, - это боковые панели, это правильно?

Самое простое решение - создать конфигурацию, которая устанавливается в контроллере, и использовать только один файл представления.

Итак, в одном действии:

@sidebars = [ {:name => 'sidebar_a', :color => 'blue'}, {:name => 'sidebar_b', :color => green} ]

В другом:

@sidebars = [ {:name => 'sidebar_c', :color => 'blue'}, {:name => 'sidebar_d', :color => green} ]

И тогда ваш взгляд становится:

<% @sidebars.each do |sidebar| %>
  <%= render(:partial => "shared/#{sidebar.name}", :locals => {:box_color => sidebar.color}) %>
<% end %> 
...