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

Вход гнезда внутри f.label(формирование рельсов)

Я хочу использовать метод 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>
4b9b3361

Ответ 1

Вы можете вставить свой хелпер формы внутри метки с помощью блока. Вот пример использования HAML, но он также работает с ERB.

= form_for your_resource do |f|
  = f.label :first_name do
    = f.text_field :first_name

Ответ 2

Как упоминалось ранее Дэн Гарланд, вы можете определенно вложить входы внутри меток простым блоком. Я предоставляю этот ответ в качестве примера, используя 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. Я пока не могу опубликовать скриншоты, чтобы показать, как это выглядит, но как только я получу достаточное количество очков, я буду.

Ответ 3

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

Ответ 4

Это невозможно с помощью встроенных помощников Rails 'label или label_tag, потому что они не принимают блок. Однако, если вы хотите вложенность, то почему бы вам просто не использовать HTML-элемент напрямую? —

<label>
  <%= f.text_field :firstname %>
</label>

Ответ 5

Используйте это небольшое обходное решение

<%= 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">

Содержание