在application.html.erb模板外部渲染特定方法

时间:2011-05-02 18:36:36

标签: ruby-on-rails ruby-on-rails-3

我正在尝试为我的webapp上的用户制作某种个人页面。因此,我希望使用与其他页面不同的CSS模板和布局。

例如,我在application.html.erb中拥有所有布局,其中所有内容都在'yield'调用中呈现。

现在我想要一个控制器的特定方法(例如UsersController中的show_personal_page)重定向到完全不同的布局和样式(甚至可以为每个用户定制)。问题是我做的任何事情都会通过application.html.erb模板,因此看起来会一样。

我想到一种方法是将'if'和'else'子句放在application.html.erb中,但这似乎不正确(即根本不是rails风格)

有什么想法吗?

谢谢!

4 个答案:

答案 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