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

Nic*_*nto 26 render partial content-for ruby-on-rails-3

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

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

这是bodyapplication.html.erb

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

</body>
Run Code Online (Sandbox Code Playgroud)

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

Dam*_*che 62

用这个替换你的渲染:

<%= render 'layouts/header' unless @disable_nav %>
Run Code Online (Sandbox Code Playgroud)

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

def landing_page
  @disable_nav = true
end
Run Code Online (Sandbox Code Playgroud)

作为一个before_filter,我鼓励上述:

application_controller.rb

def disable_nav
  @disable_nav = true
end
Run Code Online (Sandbox Code Playgroud)

my_controller

before_filter :disable_nav, only: [:landing_page]
Run Code Online (Sandbox Code Playgroud)

  • 您还可以执行`= render partial:"layouts/header"除非current_page?(landing_page_url)` (4认同)
  • 在 Rails &gt; 4 中使用 before_action 而不是 before_filter (3认同)

Ser*_*abe 6

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

样式表

如果要在样式表中添加逻辑,请首先在body标签中添加以下类:

<body class="<%= "#{controller.controller_name} #{controller.action_name}" %>">
Run Code Online (Sandbox Code Playgroud)

然后,在你的CSS中,添加如下内容:

body.controller.action .navbar {
  display: none;
}
Run Code Online (Sandbox Code Playgroud)

调节器

要将此逻辑添加到控制器,请将before filter添加到应用程序控制器:

class ApplicationController < ActionController::Base
  before_filter :show_navbar

  protected
  def show_navbar
    @show_navbar = true
  end
end
Run Code Online (Sandbox Code Playgroud)

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

class CarsController < ApplicationController
  skip_before_filter :show_navbar, only: [list, of, actions]
end
Run Code Online (Sandbox Code Playgroud)

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

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

<% if @show_navbar -%>
  <%= render 'layouts/header' %>
<% end -%
Run Code Online (Sandbox Code Playgroud)

查看

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

<%= render partial: 'header' %>
Run Code Online (Sandbox Code Playgroud)

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

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