ruby on rails -在application.html.erb模板之外呈现特定的方法



我正试图在我的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

相关内容

  • 没有找到相关文章

最新更新