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
的相同技巧将不再有效。