2010-11-19 85 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