Rails布局,多个还是继承?

时间:2011-12-19 18:56:18

标签: ruby-on-rails ruby-on-rails-3.1

我想知道最好的方法。我正在阅读关于布局的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

1 个答案:

答案 0 :(得分:2)

如果show action是此控制器中唯一需要使用“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

这样做的缺点是你必须在每个要允许两种布局的动作结束时使用determine_layout。您无法添加after_filter来确定布局,因为该点已经呈现了该操作。