Ответ 1
Вы можете вставить свой хелпер формы внутри метки с помощью блока. Вот пример использования HAML, но он также работает с ERB.
= form_for your_resource do |f|
= f.label :first_name do
= f.text_field :first_name
Я хочу использовать метод f.label для создания ярлыков элементов формы, однако - я хочу, чтобы элемент формы был вложен внутри метки. Это возможно?
- из W3C -
Чтобы связать метку с другим элементом управления неявно, элемент управления должен находиться внутри содержимого элемента LABEL. В этом случае LABEL может содержать только один элемент управления. Сама метка может быть расположена до или после соответствующего элемента управления.
В этом примере мы неявно связываем две метки с двумя элементами управления текстом:
<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>
Вы можете вставить свой хелпер формы внутри метки с помощью блока. Вот пример использования HAML, но он также работает с ERB.
= form_for your_resource do |f|
= f.label :first_name do
= f.text_field :first_name
Как упоминалось ранее Дэн Гарланд, вы можете определенно вложить входы внутри меток простым блоком. Я предоставляю этот ответ в качестве примера, используя ERB, и специально для того, чтобы точно показать, как вам нужно Группы кнопок Bootstrap работать как переключатели, поскольку они требуют этого вложенности. Мне потребовалось некоторое время, чтобы разобраться, так что, надеюсь, это поможет кому-то другому.
В этом примере (Rails 4.2) группа кнопок позволяет пользователю выбирать между тремя различными параметрами расстояния:
<%= form_for(@location) do |f| %>
<div class="field form-group">
<%= f.label :distance %><br>
<div class="btn-group" data-toggle="buttons">
<%= f.label :distance, class: "btn btn-primary active" do %>
<%= f.radio_button :distance, 0.3, checked: true %>
0.3 miles
<% end %>
<%= f.label :distance, class: "btn btn-primary" do %>
<%= f.radio_button :distance, 0.5 %>
0.5 miles
<% end %>
<%= f.label :distance, class: "btn btn-primary" do %>
<%= f.radio_button :distance, 1 %>
1 mile
<% end %>
</div>
</div>
<div class="actions">
<%= f.submit "Submit Location", class: "btn btn-success" %>
</div>
<% end %>
P.S. Я пока не могу опубликовать скриншоты, чтобы показать, как это выглядит, но как только я получу достаточное количество очков, я буду.
Вы можете использовать пользовательский 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 %>
Это невозможно с помощью встроенных помощников Rails 'label
или label_tag
, потому что они не принимают блок. Однако, если вы хотите вложенность, то почему бы вам просто не использовать HTML-элемент напрямую? —
<label>
<%= f.text_field :firstname %>
</label>
Используйте это небольшое обходное решение
<%= f.label(:content, "#{f.check_box(:allow_posts)}\n#{:content}\n".html_safe, :class => "checkbox") %>
предоставит вам этот
<label class="checkbox" for="pages_content"><input name="pages[allow_posts]" type="hidden" value="0"><input id="pages_allow_posts" name="pages[allow_posts]" type="checkbox" value="1">
Содержание