Rails - Как я могу использовать application.html.erb в моем собственном макете?

У меня есть Контроллер под названием "Страницы" с примерно 5 страницами (представлениями), для которых я создал макет под названием "page.html.erb". Итак, мой контроллер "Страницы" имеет:

class PagesController < ApplicationController
layout 'page' 

Я хочу, чтобы мой макет "page.html.erb" по умолчанию использовал "application.html.erb". Как сделать так, чтобы в моем собственном макете "page.html.erb" автоматически наследовался / отображался "application.html.erb"?

2 ответа

Если вы не укажете макет в вашем контроллере, Rails отобразит ваш application макет по умолчанию. Если вы будете следовать этой конвенции, вы можете использовать application.html.erb для вашей общей структуры страницы сайта (также хорошее место, чтобы включить таблицы стилей и JavaScript). Вы можете использовать = yield в вашем макете, чтобы указать, где ваши представления контроллера должны быть отображены.

Действия контроллера по умолчанию будут отображать их соответствующие представления. Например, если у вас есть действие foo в контроллере bars_controller.rb, Рельсы окажут /app/views/bars/foo.html.erb если вы не перенаправили или не указали другое представление для отображения в действии. На самом деле, если все, что вы хотите сделать в действии foo это рендеринг страницы, вам даже не нужно определять действие в вашем контроллере!

Конвенция закончена, мой друг.

Я обычно делю свой макет на более мелкие части (заголовок, нижний колонтитул, HTML-заголовок и т. Д.). Таким образом, я могу использовать несколько макетов, смешивая различные части вместе.

У меня была такая же проблема, как и у вас, но я хотел, чтобы моя домашняя страница имела заголовок, немного отличающийся от других страниц.

Вот как у меня это заработало:

Все, что мне нужно было сделать, это создать 2 части заголовка в app/views/shared каталог:

_home_header.html.erb
_other_header.html.erb

Затем я упомянул об этом в app/views/layouts/application.html.erb файл:

<%= render partial: '/shared/home_header' if params[:controller] == 'homes' %>
<%= render partial: '/shared/other_header' if params[:controller] != 'homes' %>

На него также можно ссылаться таким образом, используя явное условное if:

<% if params[:controller] == 'homes' %>
  <%= render partial: '/shared/home_header' %>
<% elsif params[:controller] != 'homes' %>
  <%= render partial: '/shared/other_header' %>
<% else %>
<% end %> 

Спасибо, steve klein, за ваш комментарий, который дал мне представление об этом.

Вот и все.

надеюсь, это поможет

Другие вопросы по тегам