Rails 3: yield / content_for со значением по умолчанию? - PullRequest
59 голосов
/ 07 мая 2011

Есть ли способ определить, действительно ли #content_for был применен к области действия yield в Rails?

Классическим примером является что-то вроде:

<title><%= yield :page_title %></title>

Если шаблон не устанавливает это с

<% content_for :page_title, "Something here" %>

Есть ли способ, чтобы макет поместил туда что-то еще?

Я попытался определить его с помощью #content_for в самом макете, но это только приводит к удвоению текста. Я также попробовал:

<%= (yield :page_title) or default_page_title %>

Где #default_page_title - помощник вида.

Это просто оставило блок полностью пустым.

Ответы [ 4 ]

119 голосов
/ 07 мая 2011

Вы можете использовать content_for?, чтобы проверить, есть ли контент с определенным именем:

<% if content_for?(:page_title) %>
  <%= yield(:page_title) %>
<% else %>
  <%= default_page_title %>
<% end %>

или

<%= content_for?(:page_title) ? yield(:page_title) : default_page_title %>

Тогда в ваших представлениях вы можете указать контент, например

<% content_for :page_title do %>
    Awesome page
<% end %>
12 голосов
/ 26 марта 2014

Начиная с Rails 3, yield() возвращает пустую строку, если для запрошенного ключа не было содержимого, поэтому вы можете сделать что-то вроде этого:

<title><%= yield(:page_title).presence || 'Default Page Title' %></title>

В вашем помощнике приложения, если вы определите:

def page_title(title = nil)
  title ? content_for(:page_title) { title } : content_for(:page_title).presence
end

Затем вы можете сделать что-то вроде этого:

<title><%= page_title or 'Default Page Title' %></title>

И в ваших представлениях вы можете настроить с помощью:

<% page_title 'My Page Title' %>
5 голосов
/ 15 августа 2012

Я только что выпустил новый гем, dry_views , который предоставляет расширенные методы content_for.

Преимущество перед принятым ответом состоит в том, что он позволяет вам удалить всю логику (если / еще)от ваших взглядов.

Подробные примеры см. в файле readme:

- no_content_for :key

  • Используйте тире (-), который не равен (=)
  • Запретит более позднюю визуализацию content_for.Это позволяет переопределять макеты шаблонов.

= content_for_with_default :key

  • Используйте знак равенства (=), а не тире (-)
  • Вы предоставляете егоHAML по умолчанию через блок или набор параметров, которые совпадают с тем, что вы передаете стандартному вызову "render" (т. е.: part => 'foo',: locals => {: bar => 'bar'}). `

= content_for :key

  • Используйте знак равенства (=), а не тире (-)
  • Вы предоставляете егос блоком, то есть {render: частичный => 'foo'}, и он переопределит content_for_with_default.Он имеет тот же приоритет, что и no_content_for, поэтому, какой бы рендеринг ни показывался первым, выигрывает, поэтому, если у макета есть no_content_for или content_for (с настройками по умолчанию или без них), шаблон теперь может переопределить его.
3 голосов
/ 20 октября 2014

Лучший ответ для рельсов 3 здесь:

Выход и регистр по умолчанию ||не выводить регистр по умолчанию

<%= yield(:title).presence || 'My Default Title' %>

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