除了某个动作之外,如何渲染部分内容

时间:2012-11-15 10:03:12

标签: ruby-on-rails-3 render partial content-for

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

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

这是application.html.erb的body

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

</body>

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

3 个答案:

答案 0 :(得分:61)

用以下内容替换渲染:

<%= 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

<强> my_controller

before_filter :disable_nav, only: [:landing_page]

答案 1 :(得分:6)

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

样式表

如果要在样式表中添加逻辑,请先在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.erb添加到app/views/controller_name

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

答案 2 :(得分:0)

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