3

我有不同的命名空间控制器,它们共享相同的布局:

# /app/controllers/admin/dashboard.rb
class Admins::DashboardController < ApplicationController
  ...
end

# /app/controllers/clients/dashboard.rb
class Clients::DashboardController < ApplicationController
  ...
end

这是我的目录结构:

App
|_ Controllers
|  |_ Admins
|  |  |_ dashboard_controller.rb
|  |_ Clients
|     |_ dashboard_controller.rb
|
|_ Views
   |_ Admins
   |  |_ Dashboard
   |     |_ index.html.erb
   |
   |     |_ show.html.erb
   |_ Clients
   |  |_ Dashboard
   |     |_ index.html.erb
   |     |_ show.html.erb
   |_ layouts
      |_ admin.html.erb
      |_ _sidebar.html.erb

我想确定布局是否显示AdminsClients显示正确的侧边栏,例如:

<% if admins? %>
  ...
<% elsif clients? %>
  ...
<% end %>

这甚至是解决此问题的最佳方法还是有更好的解决方案?

4

2 回答 2

1

您可以使用模板继承来实现这一点。只需render 'sidebar'在您想要重用的布局中,并在以下位置定义您的 _sidebar 模板:

app/views/admins/dashboard/_sidebar.html.erb  # for Admins::DashboardController
app/views/clients/dashboard/_sidebar.html.erb # for Clients::DashboardController
app/views/application/_sidebar.html.erb         # fallback sidebar

由于模板继承,Rails 会自动为您选择右侧边栏。

如果您也想在其他 Admin/Client 控制器中使用相应的侧边栏,您还可以为每个控制器设置一个 BaseController,如下所示:

class Admins::BaseController < ApplicationController

end

class Admins::DashboardController < Admins::BaseController
  ...
end

现在有一个_sidebar.html.erb模板,app/views/admins/base/并确保 Admins 命名空间中的每个 Controller 都继承自 Admins::BaseController。

您将看到这为您的所有命名空间控制器构建通用功能/回调等开辟了一种非常好的方式。此外,它允许您在需要时覆盖侧边栏部分,只需将_sidebar.html.erb文件放置在任何更具体的视图路径中,例如app/views/admins/myspecificsidebars/_sidebar.html.erb.

于 2012-07-18T13:25:13.447 回答
0

使用的布局方法ApplicationController

layout :user_layout

def user_layout
  #your layout logic here, return the name of the layout
end
于 2012-07-18T13:01:37.297 回答