Как оказывать частичное на все, кроме определенного действия
У меня есть частичка _header.html.erb, в которой я помещаю свой навигатор
на моей странице запуска. Я не хочу отображать навигационную панель.
это body
application.html.erb
<body>
<%= render 'layouts/header' %>
<div id="container">
<%= yield %>
</div>
</body>
Как мне отображать его при каждом действии, кроме определенных действий на определенных контроллерах?
Ответы
Ответ 1
Замените рендер следующим образом:
<%= render 'layouts/header' unless @disable_nav %>
Затем вы можете просто установить disable_nav
в значение true в любом действии контроллера:
def landing_page
@disable_nav = true
end
Как a before_filter
, о котором я бы посоветовал выше:
application_controller.rb
def disable_nav
@disable_nav = true
end
my_controller
before_filter :disable_nav, only: [:landing_page]
Ответ 2
Вы можете поместить эту логику в свои таблицы стилей, в свой контроллер или в свои представления (этот последний, только для целых контроллеров).
Stylesheets
Если вы хотите добавить логику в свои таблицы стилей, сначала добавьте в свой тег тела следующие классы:
<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' %>
Наконец, в этих контроллерах без navbar добавьте пустой _header.html.erb
в app/views/controller_name
.
Для этой опции вам нужно как минимум Rails 3.1
Ответ 3
Я бы установил другой макет для этих конкретных действий на определенных контроллерах.