Передача блока помощнику по меткам в rails3

Я хочу создать тег label с некоторыми вложенными элементами. Я использую помощник меток и пытаюсь передать внутренний html как блок, но сгенерированный HTML выглядит не так, как я ожидал. ЕРБ:

<span>Span element</span>
<%= label("object", "method") do %>
  <span>Inner span</span>
<% end %>

HTML-вывод:

<span>Span element</span> 
<span>Inner span</span> 

<label for="object_method">
<span>Span element</span> 
  <span>Inner span</span> 
</label>

Когда я передаю внутренний html, используя разметку ‹% %>, вывод будет таким, каким он должен быть:
ERB:

<span>Span element</span>
<%= label("object", "method") do %>
  <% raw '<span>Inner span</span>' %>
<% end %>

HTML-вывод:

<span>Span element</span>
<label for="object_method">
  <span>Inner span</span>
</label>

Мне интересно, это моя ошибка или ошибка в помощнике меток ActionView. Для других хелперов передача блоков работает нормально.

Спасибо, Михал


person mzaj    schedule 22.05.2011    source источник


Ответы (3)


Насколько я понимаю, в этом случае вам нужно использовать помощник label_tag:

<%= label_tag "my_label_name" do %>
  <span>Inner span</span>
<% end %>

Причина этого в том, что, хотя помощник метки формы заполняет для вас атрибут "для" (используя атрибут объекта вашей модели), он вам не нужен с вложенными элементами.

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

Итак, это ожидаемое поведение — похоже, что команда Rails намеренно построила его таким образом.

person Scott    schedule 22.05.2011

Ответ Скотта Лоу правильный, хотя я бы сделал еще один шаг вперед... Вам даже не нужно использовать для этого тег label_tag Rails. Просто используйте необработанный html следующим образом:

<label>
  <span>Inner span</span>
</label>

Если вы связываете метку с элементом формы (например, с переключателем):

<label>
  <%= f.radio_button :approval_state, 'R' %>
  Rejected
</label>
person Jeff Perrin    schedule 11.06.2012

В Rails 3.2.11 это работает для меня:

<span>Span element</span>
<%= label :item, :method do %>
  <span>Inner span</span>
<% end %>

Результат:

<span>Span element</span>
<label for="item_method">
  <span>Inner span</span>
</label>
person fguillen    schedule 02.03.2013