как сделать частичным все, кроме определенного действия

У меня есть партиал _header.html.erb, в который я помещаю свою панель навигации.

на моей странице запуска я не хочу отображать панель навигации.

это body из application.html.erb

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

</body>

Как мне отображать его для каждого действия, кроме определенных действий на определенных контроллерах?


person Nick Ginanto    schedule 15.11.2012    source источник


Ответы (3)


Замените ваш рендер на это:

<%= 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]
person Damien Roche    schedule 15.11.2012
comment
Вы также можете сделать =render partial: "layouts/header" unless current_page?(landing_page_url) - person Brian; 14.04.2014
comment
используйте before_action вместо before_filter с Rails › 4 - person hook38; 06.05.2019

Вы можете поместить эту логику в свои таблицы стилей, в свой контроллер или в свои представления (это последнее, только для целых контроллеров).

Таблицы стилей

Если вы хотите добавить логику в свои таблицы стилей, сначала добавьте в тег 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.

person Serabe    schedule 15.11.2012

Я бы установил другой макет для этих конкретных действий на определенных контроллерах.

person Abhay Kumar    schedule 15.11.2012
comment
Учитывая, что так много повторений (все, кроме заголовка), я бы не рассматривал это. - person Serabe; 15.11.2012
comment
у вас может быть условие if вокруг частичного заголовка, которое будет выполняться каждый раз по умолчанию, за исключением определенного условия. - person Abhay Kumar; 16.11.2012
comment
Тогда это не другой макет. - person Serabe; 16.11.2012
comment
да, это не другой макет, если вы считаете, что есть условие для проверки наличия заголовка или нет. - person Abhay Kumar; 16.11.2012