Расширение существующего макета в Rails - PullRequest
6 голосов
/ 06 октября 2010

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

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

Итак, у меня естьчто-то вроде этого в моем макете приложения:

<html>
<body>

<div id="content">

<%= yield %>

</div>

</body>
</html>

и я хочу

<html>
<body>

<div id="content">

  <div id="sidebar"></div>

  <%= yield %>

</div>

</body>
</html>

Есть ли способ сделать это без копирования кода?

Ответы [ 3 ]

5 голосов
/ 06 октября 2010

Вы можете иметь более одного yield в макете, просто присвойте дополнительным имя:

<html>
<body>
  <div id="content">
    <%= yield :sidebar %>
    <%= yield %>
  </div>
</body>
</html>

Вы можете добавить HTML для этого yield, используя content_for метод

<% content_for :sidebar do -%>
  <div id="sidebar"></div>
<% end -%>

Но вам придется добавить это к каждому представлению, для которого вы хотите иметь боковую панель. Вместо этого создайте views/layouts/application_with_sidebar.html.erb

<% content_for :sidebar do -%>
  <div id="sidebar"></div>
<% end -%>

<%= render :file => 'layouts/application' %>

Дополнительная литература

Если вы предпочитаете, чтобы количество yield с было минимальным, вместо этого вы можете вкладывать свои макеты.

просмотров / макеты / application.html.erb

<html>
<body>
  <div id="content">
    <%= yield(:with_sidebar) or yield %>
  </div>
</body>
</html>

просмотров / макеты / application_with_sidebar.html.erb

<% content_for :with_sidebar do -%>
  <div id="sidebar"></div>
<% end -%>

<%= render :file => 'layouts/application' %>

Контроллеры / accounts_controller.rb

class AccountsController < ApplicationController
  layout 'application_with_sidebar'
  ...
end
4 голосов
/ 06 октября 2010

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

http://guides.rubyonrails.org/v2.3.8/layouts_and_rendering.html#using-nested-layouts

3 голосов
/ 06 октября 2010

Если ваш маршрут / аккаунт привязан к контроллеру аккаунта, вы всегда можете иметь полноценный макет с условной частью, подобной этой

render :template => "/shared/sidebar" if controller.controller_name == "account"

(Должен признать, что это не радует глаз)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...