2010-11-19 98 views
31

我在'admin'命名空间下创建了许多控制器&视图,但它们仍然从应用程序布局中拉出。我如何制作适用于命名空间路线中所有视图的布局,并且仍然使用当前布局来处理其他页面?rails 3:命名空间路由的布局

回答

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。

但是,如果你正在寻找的东西分类,这可能是一个更好的办法:如果你有一个基地AdminController从ApplicationController继承而来,你可以有你的,比方说,管理员:: 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 %> 

的一件事意识到的是,管理员::把PeopleController将继承AdminController定义(就像任何事情任何行动在ApplicationController中定义的变量在所有子类中都可用)。这通常不是一个问题,因为无论如何,您可能会覆盖方法,但只是要意识到这一点。如果你没有AdminController,你可以创建一个没有任何操作的布局。

+2

'class AdminController'在'app/controllers'或'app/controllers/admin'下面? – jdscosta91 2013-08-31 00:37:27

+0

在'app/controllers'下 – Damien 2013-09-21 14:05:50

+0

我正在尝试这个,它似乎工作,但我失去了像Bootstrap或Semantic-UI这样的框架给出的样式和功能。任何想法如何解决这个问题? – Sebastialonso 2014-03-10 19:02:07

40

我通常在我的命名空间中有一个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 
+2

我认为这比接受的答案更优雅,更有条理。有没有办法让所有由'rails g'命令生成的控制器从Admin :: BaseController继承? – berezovskyi 2014-01-09 16:51:10

+0

这个基地控制器应该去哪里? – Sebastialonso 2014-03-10 15:20:51

+3

控制器类是Admin :: BaseController,因此Rails假定它将在controllers/admin文件夹的base_controller.rb文件中定义。 – IAmNaN 2014-04-16 18:45:25