block_given? всегда возвращает true в шаблонах erb - PullRequest
3 голосов
/ 22 октября 2019

В Rails 5.2.3 мне нужно визуализировать партиал, который принимает необязательный блок.

# users/_user.html.erb
...
<% if block_given? %>
  <%= yield %>
<% else %>
  <h1>Goodbye world</h1>
<% end %>
...

Однако block_given? возвращает true независимо от того, с какой версией я выберу:


<%# Version 1 - block_given? returns true %>
<%= render partial: "users/_user" do %>
  <h1>hello world</h1>
<% end %>

<%# Version 2 - block_given? also returns true %>
<%= render partial: "users/_user" %>

Что здесь происходит и почему это происходит?

1 Ответ

2 голосов
/ 23 октября 2019

Поскольку все шаблоны Rails поддерживают content_for :xyz, который запускается yield :xyz, это означает, что все шаблоны всегда заключаются в блок, подготовленный для извлечения этих content_for данных.

Поскольку этот запрограммированный блок всегда есть, для размещения content_for это означает, что block_given? всегда будет возвращать true.

Я думаю, что это может быть небольшой недосмотр вРельсы вид дизайна. Было бы неплохо, если бы у нас был отдельный метод, чтобы определить, был ли частичный блок предоставлен.

Одна идея для обхода проблемы:

<% if (block = yield).empty? %>
  <h1>Goodbye world</h1>
<% else %>
  <%= block %>
<% end %>
...