Подтвердить что ты не робот

Rails 3: yield/content_for с некоторым значением по умолчанию?

Есть ли способ определить, действительно ли #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 - помощник вида.

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

4b9b3361

Ответ 1

Вы можете использовать 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 %>

Ответ 2

Как и в случае с 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' %>

Ответ 3

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

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

См. readme для обширных примеров:

- no_content_for :key

  • Использовать тире (-) не равно (=)
  • Препятствует более позднему content_for от рендеринга. Это позволяет переопределять шаблоны шаблонов.

= content_for_with_default :key

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

= content_for :key

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