Я хочу использовать f.label метод для создания моих маркировок элемента формы, однако - я хочу вложить элемент формы в маркировке. Действительно ли это возможно?
- От W3C-
Для соединения маркировки с другим управлением неявно элемент управления должен быть в содержании элемента МАРКИРОВКИ. В этом случае МАРКИРОВКА может только содержать один элемент управления. Сама маркировка может быть расположена прежде или после связанного управления.
В этом примере мы неявно связываем две маркировки с двумя средствами управления вводом текста:
<form action="..." method="post">
<p>
<label>
First Name
<input type="text" name="firstname" />
</label>
<label>
<input type="text" name="lastname" />
Last Name
</label>
</p>
</form>
Это невозможно с помощью встроенных в Rails помощников label
или label_tag
, поскольку они не принимают блок. Однако, если вам нужна вложенность, то почему бы вам просто не использовать HTML-элемент напрямую? -
<label>
<%= f.text_field :firstname %>
</label>
Вы можете использовать настраиваемый FormBuilder, чтобы разрешить помощнику меток принимать блок. Это так просто:
class SmartLabelFormBuilder < ActionView::Helpers::FormBuilder
def label(method, content_or_options_with_block = nil, options = {}, &block)
if !block_given?
super(method, content_or_options_with_block, options)
else
options = content_or_options_with_block.is_a?(Hash) ? content_or_options_with_block.stringify_keys : {}
@template.content_tag(:label, options, &block)
end
end
end
Затем вы можете использовать свой конструктор форм следующим образом:
<% form_for(@article, :builder => SmartLabelFormBuilder) do |form| %>
<% form.label(:title) do %>
Title
<%= form.text_field(:title) %>
<% end %>
<% end %>