2011-12-19 76 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