【问题标题】:Rails app with multiple page layouts - how to DRY up?具有多个页面布局的 Rails 应用程序 - 如何干燥?
【发布时间】:2011-04-02 07:37:22
【问题描述】:

我有一个基于 Rails 的站点,它具有基本的两列布局。右侧是带有不同(我们只是说)垂直小部件的侧边栏。根据您访问的页面,可以包含、排除小部件并以不同的顺序排列。例如:

主页(应用程序)

页面内容...

边栏

  • 小部件 A
  • 小部件 B
  • 小部件 C

第 X 页

页面内容...

边栏

  • 小部件 D
  • 小部件 A
  • 小部件 C

第 Y 页

页面内容...

边栏

  • 小部件 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>

我基本上只是对其他页面布局重复此模式,但使用特定于页面的小部件。看起来不太干。

我认为必须有一种更有效的方法来做到这一点。有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails layout views controller dry


    【解决方案1】:

    您可以使用一个布局文件来定义所有页面的两列结构,然后使用 Rail 的 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 块中使用这些指令。

    一般技术描述here

    【讨论】:

      猜你喜欢
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 2021-07-21
      • 1970-01-01
      • 2015-06-13
      相关资源
      最近更新 更多