2011-12-19 79 views
1

我想知道這樣做的最好方法。我正在閱讀關於佈局的Rails指南,但我對此有點難以理解。Rails佈局,多重還是繼承?

我有一個用戶控制器和會話控制器。用戶控制器用於「註冊」,會話控制器用於「登錄」。這兩個控制器都呈現相同的登錄和註冊佈局(accounts.html.erb)。

一旦他們登錄,我想爲他們登錄時發生的所有事情(application.html.erb)呈現不同的佈局。我的問題是,在用戶控制器中,我有一個「顯示」操作,它是用戶配置文件,只有當用戶登錄時纔可以查看,但此「顯示」操作正在使用accounts.html.erb佈局,因爲'創造'和'新'行動。我希望'show'動作使用application.html.erb以及這裏的其餘動作來使用accounts.html.erb。我應該使用模板繼承來處理這類事情嗎?或者有什麼合適的方法去做這類事情?

或許有些代碼也將有所幫助:

class UsersController < ApplicationController 
    layout 'accounts' 

def show 
    @user = User.find(params[:id]) 
    @title = @user.name 
end 

def new 
    @user = User.new 
    @title = "Sign up" 
end 

def create 
    @user = User.new(params[:user]) 
    if @user.save 
    sign_in @user 
    flash[:success] = "Welcome" 
    redirect_to @user 
    else 
    @title = "Sign up" 
    render :action => "new" 
    end 
end 

回答

2

如果顯示的動作是在這個控制器是唯一一個需要使用「application.html.erb」只是使它該行動結束時的佈局。

render :layout => "application" 

如果您正在尋找一點點更強大的,你可以的方法添加到您的application_controller.rb確定基於佈局做一些用戶是否在簽署與否:

class ApplicationController < ActionController::Base 
    ... 
    def determine_layout 
    if (signed_in) then 
     return "application" 
    else 
     return "accounts" 
    end 
    end 
    ... 
end 

class UsersController < ApplicationController 
    def show 
    @user = User.find(params[:id]) 
    @title = @user.name 

    render :layout => determine_layout 
    end 
end 

缺點是你必須在每個你想允許兩種佈局的動作結束時進行判斷佈局。您無法添加after_filter來確定佈局,因爲該操作已經由該點呈現。

+1

哦,那很簡單?我以爲你只能做到這一點,爲該行動渲染一個特定的模板,而不是佈局......太棒了!謝謝傑夫。 – JeffC 2011-12-19 19:41:59