Html 应用程序布局中的嵌套布局

Html 应用程序布局中的嵌套布局,html,ruby-on-rails,ruby-on-rails-4,nestedlayout,Html,Ruby On Rails,Ruby On Rails 4,Nestedlayout,我对嵌套布局有一些小问题。在我的网站上,我需要为管理员制作一个单独的网站部分 我的application.html.erb文件中有: <body> <%= render 'layouts/header' %> <div class="container"> <%= yield %> <%= render 'layouts/footer' %> </div> </b

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

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

<body>
    <%= render 'layouts/header' %>
    <div class="container">
        <%= yield %>
        <%= render 'layouts/footer' %>
    </div>
</body>
我的新布局是
layouts/sublayouts/admin.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> 
<%= render 'admins/menu' %>
<%= yield %>
管理站点将具有以下结构:

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

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

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

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

所需的行为是当用户单击
管理面板
链接或管理菜单上的任何链接时,出现管理菜单

我建议这样做的方式是,您有一个管理控制器,它处理到所有管理视图的路由,因此单击
管理面板
按钮,管理菜单中的所有链接都将由您的管理控制器处理。向管理员控制器添加before_筛选器,如下所示:

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

  private
  def set_admin_status
   @admin = true
  end
end
#app/controller/admin_controller.rb
类AdminController
在应用程序模板中执行以下操作:

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

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

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

应用程序\u控制器.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
namespace :admin do
  root to: 'home#index'
  resources :admins
end
class Admin::AdminsController < ApplicationController
  def index
    // code
  end
end
app/views/layouts/application\u admin.html.haml

Header/Menu
   |
Container
   |Content
Footer
Header/Menu
   |
Container
   |Content
     |Admin Menu
     |Admin Content
   |
Footer
更新1


config/routes.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
namespace :admin do
  root to: 'home#index'
  resources :admins
end
class Admin::AdminsController < ApplicationController
  def index
    // code
  end
end
app/controllers/admin/admins\u 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
namespace :admin do
  root to: 'home#index'
  resources :admins
end
class Admin::AdminsController < ApplicationController
  def index
    // code
  end
end
class Admin::AdminsController
我没有成功使用此代码。如果self.class.parent==Admin,则此行
比较的是当前控制器的名称“Admin”?在我的例子中,我设置了
如果self.class.parent==AdminsController
@user330486我已经更新了帖子,很快你就应该将你的
admins\u controller.rb
移动到
app/controllers/admin
namespacehm,现在我收到以下错误:
无法呈现布局:未初始化的常量ApplicationController::Admin
与您的相同。它说这是主控制器中的一个名称错误,我从主控制器控制所有静态页面。不在AdminsController中..看起来不错,但当我单击打开视图的按钮时,该菜单才显示出来,我该如何实现?目前,它将与所有内容一起立即出现在头版。您能否澄清一点:您希望管理员导航到管理员页面(因此只有一个视图可以显示管理员/菜单部分),还是您有一个完整的管理部分,这是一系列页面(所以有多个视图可以加载此部分)?确定:)在标题中,我有一个带有链接的菜单(管理面板、链接2等)。用户单击Link2后,链接内容显示在
yield
位置。但在用户点击管理面板后,带有链接的新菜单(AdminMenuLK1等)显示在
yield
内。现在我有两份菜单!管理员单击AdminMenuLink1后,内容显示在下面,但第二个菜单仍在那里。如果用户仅在菜单2内的链接(AdminMenuLink1等)上导航,则菜单应始终存在。如果管理员单击第一个菜单中的链接2,他将退出管理员菜单并再次看到正常内容,而不使用第二个菜单。让我更新我的答案。是的,这很有效!非常感谢。现在我唯一需要弄清楚的是,如果我需要其他控制器处理的一些视图,如何离开该菜单。使用
set\u admin\u status
的相同技巧将不再有效。