我已经在 "admin" 命名空间下创建了许多控制器和视图,但它们仍然从应用程序布局中拉取。我该如何创建一个应用于所有命名空间路由中的视图的布局,并仍然为其他页面使用当前布局?
我已经在 "admin" 命名空间下创建了许多控制器和视图,但它们仍然从应用程序布局中拉取。我该如何创建一个应用于所有命名空间路由中的视图的布局,并仍然为其他页面使用当前布局?
我通常在我的命名空间中有一个基础控制器类,然后让所有的控制器都继承自它。这使得我可以将公共的、命名空间特定的代码放在基础类中,而该命名空间中的所有控制器都可以受益。例如:
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将使用应用程序布局。例如,如果您有一个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。
但如果你想要进行分组,这可能是一种更好的方式: 如果你有一个基础AdminController从ApplicationController继承,你可以让你的Admin::PersonController从AdminController继承,它就会继承admin布局。
我不知道你代码的具体情况,但你可能会有:
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会继承AdminControler所定义的任何动作(就像ApplicationController中定义的内容在所有子类中都可以使用一样)。这通常不是问题,因为你可能会覆盖这些方法,但要注意。如果你没有AdminController,你可以创建一个没有动作的AdminController,只供布局使用。
class AdminController
是在 app/controllers
还是 app/controllers/admin
下面? - jdscosta91app/controllers
下面。 - DamienAdminController
来渲染所有管理页面的主要“index”页面并不是一个好主意,因为从它继承的所有控制器也将继承该 show
操作。我认为最好创建另一个单独的控制器,它继承自 admin
控制器,例如 dashboard
,然后在其中拥有一个 index
操作。 - Inklingapp/controllers/admin
下面吗?我的 Rails 4 项目就是这样设置的,后者也可以工作。 - FloatingRock
rails g
命令生成的所有控制器都继承自Admin::BaseController
? - berezovskyistylesheets
和javascripts
文件夹下的 admin 文件夹中创建的特定 CSS 和 JS 文件? - alexventuraio