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