3

我对嵌套布局没有什么问题。在我的网站上,我只需要为管理员制作网站的一个单独部分。

我的application.html.erb文件中有这个:

<body>
    <%= render 'layouts/header' %>
    <div class="container">
        <%= yield %>
        <%= render 'layouts/footer' %>
    </div>
</body>

我想知道现在如何制作另一个这样的模板以插入其中,<%= yield %>因为对于管理员部分,我再次需要站点的固定部分,例如headerfooter布局。而不是headerfooter我将有两个菜单。我想<%= yield %>填充新模板,该模板顶部有菜单,新模板将<%= yield %>填充来自管理控制器的操作。因此,菜单将始终位于顶部。

我做了一个部分菜单views/admins/_menu.html.erb

<div>  
    <div>  
        <div class="container">  
            <ul>
                <li><%= link_to "Action1", '#' %></li>
                <li><%= link_to "Action2", '#' %></li>
                <li><%= link_to "Action3", '#' %></li>
            </ul>
        </div>  
    </div>  
</div> 

我的新布局是layouts/sublayouts/admin.html.erb

<%= render 'admins/menu' %>
<%= yield %>

目前的替代方法是views/admins/_menu.html.erb在顶部的每个视图中渲染,但这对我来说并不是一个好的解决方案。

常规站点将具有以下结构:

Header/Menu
   |
Container
   |Content
Footer

管理站点将具有以下结构:

Header/Menu
   |
Container
   |Content
     |Admin Menu
     |Admin Content
   |
Footer

实现这一目标的最佳方法是什么?

4

2 回答 2

1

更新:根据评论,我更新了答案,更好地理解了这个问题

最好的方法是将其合并到您的application.html.erb布局中。

所需的行为是在用户单击Admin Panel链接或管理菜单上的任何链接时显示管理菜单。

我建议这样做的方法是你有一个管理控制器来处理路由到你所有的管理视图,所以点击Admin Panel按钮和管理菜单中的所有链接都将由你的管理控制器处理。像这样向您的管理控制器添加一个 before_filter:

# app/controller/admin_controller.rb
class AdminController < ActionController::Base
  before_filter: set_admin_status

  private
  def set_admin_status
   @admin = true
  end
end

在您的应用程序模板中执行以下操作:

# application.html.erb
<body>
    <%= render 'layouts/header' %>
    <div class="container">
        <% if @admin %>
          <%= render 'admins/menu' %>
        <% end %>
        <%= yield %>
        <%= render 'layouts/footer' %>
    </div>
</body>

这应该做的是,每次您导航到与Admin Panel管理菜单中的链接或任何链接对应的页面时,它都会将 @admin_status 标志设置为 true,并且您的布局将呈现管理菜单,我相信这是所需的行为。

于 2014-02-14T18:11:39.970 回答
1

通常我会执行以下操作来完成相同的问题,我会根据父类创建单独的布局:

application_controller.rb

class ApplicationController < ActionController::Base    
  protect_from_forgery
  layout :layout

  private
  def layout
    if self.class.parent == Admin
      'application_admin'
    else
      'application'
    end
  end
end

应用程序/视图/布局/application.html.haml

Header/Menu
   |
Container
   |Content
Footer

应用程序/视图/布局/application_admin.html.haml

Header/Menu
   |
Container
   |Content
     |Admin Menu
     |Admin Content
   |
Footer

更新 1


config/routes.rb

namespace :admin do
  root to: 'home#index'
  resources :admins
end

app/controllers/admin/admins_controller.rb

class Admin::AdminsController < ApplicationController
  def index
    // code
  end
end
于 2014-02-14T18:14:46.327 回答