每个模块的不同局部视图

时间:2012-07-18 12:43:01

标签: ruby-on-rails

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

# /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 %>

这也是解决这个问题的最佳方式,还是有更好的解决方案?

2 个答案:

答案 0 :(得分:1)

您可以使用模板继承来实现此目的。只需在{/ 1}}布局中重复使用并在_sidebar模板中定义:

render 'sidebar'

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

如果你想在其他管理员/客户端控制器中使用相应的侧边栏,你也可以为它们各自设置一个BaseController,如下所示:

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

现在class Admins::BaseController < ApplicationController end class Admins::DashboardController < Admins::BaseController ... end 中有一个_sidebar.html.erb模板,并确保Admins命名空间中的每个Controller都继承自Admins :: BaseController。

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

答案 1 :(得分:0)

使用ApplicationController的布局方法。

layout :user_layout

def user_layout
  #your layout logic here, return the name of the layout
end