【问题标题】:Rails: multiple layouts with similar code and structure - DRY?Rails:具有相似代码和结构的多个布局 - DRY?
【发布时间】:2011-08-14 15:19:19
【问题描述】:

下面的视图代码有点冗长,所以让我先陈述我的问题和疑问。我有多种布局,每种布局的代码略有不同。目前,我试图通过使用部分来限制任何冗余。但是,我仍然想知道它是否可以更干燥。显然,保持事物尽可能 DRY 是核心原则之一,但我想知道在某些情况下,只要保持一致(即使它不是 DRY)仍然可以为您提供所需的效率和可维护性,这值得付出多少努力。那么,鉴于此,您会推荐什么?顺便说一句,我的环境是 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>

【问题讨论】:

    标签: ruby-on-rails model-view-controller layout dry


    【解决方案1】:

    似乎唯一改变的是侧边栏框,这是正确的吗?

    最简单的解决方案是提出一个在控制器中设置的配置,并且只使用一个视图文件..

    所以在一个动作中:

    @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 %> 
    

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2017-02-10
      • 2015-10-05
      • 1970-01-01
      • 2014-03-21
      相关资源
      最近更新 更多