我有不同的命名空间控制器,它们共享相同的布局:
# /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
我想确定布局是否由Admins
或Clients
显示,以便我可以显示正确的侧边栏,例如:
<% if admins? %>
...
<% elsif clients? %>
...
<% end %>
这也是解决这个问题的最佳方式,还是有更好的解决方案?
答案 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