【发布时间】:2011-05-12 10:24:33
【问题描述】:
我在“管理员”命名空间下创建了许多控制器和视图,但它们仍然从应用程序布局中提取。如何制作适用于命名空间路由中所有视图的布局,并且仍然为其他页面使用当前布局?
【问题讨论】:
标签: ruby-on-rails layout
我在“管理员”命名空间下创建了许多控制器和视图,但它们仍然从应用程序布局中提取。如何制作适用于命名空间路由中所有视图的布局,并且仍然为其他页面使用当前布局?
【问题讨论】:
标签: ruby-on-rails layout
我通常在我的命名空间中有一个 Base 控制器类,然后让该命名空间中的所有控制器都继承自它。这允许我将通用的、特定于命名空间的代码放在 Base 中,并且该命名空间中的所有控制器都可以利用。例如:
class Admin::BaseController < ApplicationController
layout 'admin'
before_filter :require_admin_user
end
class Admin::WidgetsController < Admin::BaseController
# inherits the 'admin' layout and requires an admin user
end
【讨论】:
rails g命令生成的所有控制器都继承自Admin::BaseController?
stylesheets 和javascripts 文件夹中?
一般来说,如果没有与控制器匹配的布局,Rails 将使用应用程序布局。例如,如果您有一个 PeopleController,Rails 会查找 layouts/people.html.erb,如果没有找到,则查找 application.html.erb。
如果要覆盖此约定,可以显式指定特定布局。
class Admin::PeopleController
layout 'some_layout'
end
然后该控制器将使用 some_layout.html.erb 而不是查找 people.html.erb 和 application.html.erb。
但是,如果您想对事物进行分组,这可能是一种更好的方法:如果您有一个继承自 ApplicationController 的基本 AdminController,那么您可以让您的 Admin::PersonController 继承自AdminController,它将继承管理布局。
我不知道你的代码的细节,但你可能有:
class AdminController
def show
#render a template linking to all the admin stuff
end
end
app/controllers/admin/people_controller.rb:
class Admin::PeopleController < AdminController
#your awesome restful actions in here!
end
views/layouts/admin.html.erb:
Hello from the Admin!
<%= yield %>
要意识到的一件事是 Admin::PeopleController 将继承 AdminController 定义的任何操作(就像在 ApplicationController 中定义的任何内容在所有子类中都可用一样)。这通常不是问题,因为无论如何您都可能会覆盖这些方法,但只是要注意这一点。如果您没有 AdminController,您可以制作一个不带任何操作的控制器,仅用于布局。
【讨论】:
class AdminController 在app/controllers 或app/controllers/admin 下?
app/controllers下
AdminController 为所有管理内容呈现主“索引”页面不是一个好主意,因为从它继承的所有控制器也将继承show 行动。我认为最好创建另一个从admin 控制器继承的独立控制器,例如dashboard,然后在其中有一个index 操作。
app/controllers/admin 下吗?我的 Rails 4 项目就是这样设置的,并且可以与后者一起使用。