我创造了许多控制器& “admin”命名空间下的视图,但它们仍在应用程序布局中。如何制作适用于命名空间路径中所有视图的布局,并仍然使用其他页面的当前布局?
答案 0 :(得分:41)
我的命名空间中通常有一个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
答案 1 :(得分:36)
一般来说,如果没有与控制器匹配的布局,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,则可以仅为布局目的制作一个没有操作的。