28

我有一个 _header.html.erb 部分,这是我放置导航栏的地方

在我的启动页面上,我不想显示导航栏。

这是bodyapplication.html.erb 的

<body>
<%= render 'layouts/header' %>
<div id="container">
    <%= yield %>
</div>

</body>

除了特定控制器上的特定操作之外,如何在每个操作上呈现它?

4

3 回答 3

66

用这个替换你的渲染:

<%= render 'layouts/header' unless @disable_nav %>

然后,您可以disable_nav在任何您喜欢的控制器操作中简单地设置为 true:

def landing_page
  @disable_nav = true
end

作为一个before_filter,我会在上面鼓励:

application_controller.rb

def disable_nav
  @disable_nav = true
end

我的控制器

before_filter :disable_nav, only: [:landing_page]
于 2012-11-15T10:49:47.830 回答
7

您可以将该逻辑放入样式表、控制器或视图中(最后一个,仅适用于整个控制器)。

样式表

如果您想在样式表中添加逻辑,请首先将以下类添加到您的 body 标记中:

<body class="<%= "#{controller.controller_name} #{controller.action_name}" %>">

然后,在您的 css 中,添加如下内容:

body.controller.action .navbar {
  display: none;
}

控制器

要将此逻辑添加到您的控制器,请在您的应用程序控制器中添加一个前置过滤器:

class ApplicationController < ActionController::Base
  before_filter :show_navbar

  protected
  def show_navbar
    @show_navbar = true
  end
end

然后,如果您不想在 CarsController 中显示导航栏,请执行以下操作:

class CarsController < ApplicationController
  skip_before_filter :show_navbar, only: [list, of, actions]
end

[list, of, actions]您不想在其中显示导航栏的操作在哪里。

最后,将布局更改为如下所示:

<% if @show_navbar -%>
  <%= render 'layouts/header' %>
<% end -%

意见

如果要禁用整个控制器的标头,首先,将标头移动到app/views/application/并将渲染更改为:

<%= render partial: 'header' %>

最后,在那些没有导航栏的控制器中,_header.html.erbapp/views/controller_name.

要使此选项起作用,您至少需要 Rails 3.1

于 2012-11-15T10:19:16.530 回答
0

我会为特定控制器上的特定操作设置不同的布局。

于 2012-11-15T10:18:26.657 回答