2011-05-02 29 views
2

我正在爲webapp上的用戶製作一些個人頁面。因此,我想使用不同的CSS模板和佈局,而不是我的其他頁面。在application.html.erb模板外呈現特定的方法

例如,我在application.html.erb中擁有所有的佈局,其中所有內容都在'yield'調用中呈現。

現在我想要一個控制器的具體方法(例如UsersController中的show_personal_page)重定向到完全不同的佈局和樣式(甚至可能爲每個用戶定製)。問題是我所做的任何事情都會通過application.html.erb模板傳遞,因此看起來是一樣的。

我認爲要做到這一點的方法之一是把「如果」和「其他」條款內application.html.erb但這似乎並不是正確的(即不軌風格可言)

有什麼建議嗎?

謝謝!

回答

3

您可以隨時在頂部定義它定義自定義佈局控制器在名稱users.html.erbapp/views/layout,Rails將自動使用該佈局的users_controller(即如果您使用您的控制器的名稱佈局)的每個視圖。

如果你想使用的佈局在控制器中的具體方法,你可以使用

class UsersController 
    layout 'user', :only => :show_personal_page 
    . 
    . 
end 

,或者你可以直接調用佈局方法

class UsersController 
    def show_personal_page 
    . 
    render :layout => :user 
    end 
end 

您可以選擇不通過在該方法中使用render :layout => false或在控制器頂部使用layout nil來使用任何佈局。

如果要有條件地指定佈局,最好的方式做到這一點會是這樣

class UsersController 
    layout :conditional_layout, :only => :show_personal_page 

    def conditional_layout 
    ..(your condition) 
    (return correct layout) 
    end 
    . 
    . 
end 
0

創建views/layouts/user.html.erb一個新的佈局,然後將其設置在控制器:

layout 'user' 

或者你也可以設置layout false,放在視圖文件頁面的所有的結構,而不是依賴於佈局在所有。

1

您可以從您的用戶控制器渲染特定佈局:

class UsersController < ApplicationController 
    ... 

    def controller_method 
    #should be a string (:layout requires a string) 
    var user_specific_layout = get_specific_layout(user) 
    render :layout => user_specific_layout 
    end 
end 

退房的Layouts and Rendering in Rails導向以獲得更多信息。

0

您也可以通過一個進程的佈局方法:如果你創建佈局

class UsersController 
    layout 'user' 
    . 
    . 
end 

逸岸:

def MySuperController < ApplicationController 
    layout Proc.new{|controller| controller.current_user.layout} 
    ... 
end