我想知道最好的方法。我正在阅读关于布局的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
端
答案 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来确定布局,因为该点已经呈现了该操作。