我正试图在我的webapp上为用户制作某种个人页面。因此,我想使用不同的CSS模板和布局比我的其他页面。
例如,我的所有布局在application.html.erb中,其中所有内容都在'yield'调用中呈现。
现在我想要一个控制器的特定方法(例如UsersController中的show_personal_page)重定向到一个完全不同的布局和风格(甚至可能为每个用户定制)。问题是,我所做的任何事情都将通过application.html.erb模板,因此看起来都是一样的。
我想到了一种方法来做到这一点是把'if'和'else'子句在application.html.erb,但这似乎是不正确的(即不是rails风格在所有)
任何想法?
谢谢!
您可以通过在顶部定义自定义布局来定义控制器:
class UsersController
layout 'user'
.
.
end
事实上,如果你在app/views/layout
中创建名为users.html.erb
的布局,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
你可以从你的用户控制器呈现特定的布局:
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
查看Rails中的布局和渲染指南了解更多信息
在views/layouts/user.html.erb
中创建一个新的布局,然后在控制器中使用:
layout 'user'
或者您可以设置layout false
并将页面的所有结构放在视图文件中,而完全不依赖于布局。
你也可以传递一个过程给layout方法:
def MySuperController < ApplicationController
layout Proc.new{|controller| controller.current_user.layout}
...
end