Мітки для перемикачів у формі рейок


147

Моє запитання подібне до цього, але для програми Rails.

У мене є форма з деякими перемикачами, і я хотів би пов’язати з ними мітки. labelФорма помічник приймає тільки поле форми в якості параметра, але в цьому випадку у мене є кілька перемикачів для одного поля форми. Єдиний спосіб, який я бачу зробити це - це створити вручну мітку, жорстке кодування ідентифікатора, який автоматично генерується для перемикача. Хтось знає про кращий спосіб це зробити?

Наприклад:

<% form_for(@message) do |f| %>
    <%= label :contactmethod %>
    <%= f.radio_button :contactmethod, 'email', :checked => true %> Email
    <%= f.radio_button :contactmethod, 'sms' %> SMS
<% end %>

Це породжує щось на кшталт:

<label for="message_contactmethod">Contactmethod</label>
<input checked="checked" id="message_contactmethod_email" name="message[contactmethod]" value="email" type="radio"> Email
<input id="message_contactmethod_sms" name="message[contactmethod]" value="sms" type="radio"> SMS

Що я хочу:

<input checked="checked" id="message_contactmethod_email" name="message[contactmethod]" value="email" type="radio"><label for="message_contactmethod_email">Email</label>
<input id="message_contactmethod_sms" name="message[contactmethod]" value="sms" type="radio"> <label for="message_contactmethod_sms">SMS</label>

Відповіді:


145
<% form_for(@message) do |f| %>
  <%= f.radio_button :contactmethod, 'email', :checked => true %> 
  <%= label :contactmethod_email, 'Email' %>
  <%= f.radio_button :contactmethod, 'sms' %>
  <%= label :contactmethod_sms, 'SMS' %>
<% end %>

91
Існує й інший спосіб: передача :valueпараметра f.label"В" зробить те саме. напр <%= f.label :contactmethod, 'SMS', :value => 'sms' %>. Це встановлює атрибут "для" тегу мітки правильно, завдяки чому натискання мітки вибирає відповідний перемикач. У відповіді вище, просто використання labelпомічника призведе до того, що атрибут "за" буде неправильним, коли перемикач створений за допомогою FormBuilder
John Douthat

2
Я просто хотів сказати, що як новачок у Rails, я знайшов цю відповідь тією, до якої продовжую повертатися. Це дар, який продовжує дарувати. Ну, поки я все одно не пам’ятаю належного синтаксису ... :)
Джон Галлахер

також перевірте це, якщо ви шукаєте для встановлення checkedзначення умовно stackoverflow.com/a/4708921/429521
Феліпе Сабіно

8
Для майбутніх читачів Джон Дуут має правильну відповідь на це питання. Ця відповідь більше не є правильною.
суперлюмінація

230

Якщо передавати :valueпараметр для f.labelзабезпечення forатрибута тегу мітки, такий же, як ідентифікатор відповідногоradio_button

<% form_for(@message) do |f| %>
  <%= f.radio_button :contactmethod, 'email' %> 
  <%= f.label :contactmethod, 'Email', :value => 'email' %>
  <%= f.radio_button :contactmethod, 'sms' %>
  <%= f.label :contactmethod, 'SMS', :value => 'sms' %>
<% end %>

Дивіться ActionView :: Helpers :: labelHeader FormHelper

параметр: value, призначений для націлювання міток для тегів radio_button


5
ну, це може мати 0 голосів, оскільки на нього відповіли місяці пізніше, але насправді це хороший. Caveat: потрібні Rails> = 2.3.3
tokland

3
цей метод також надає field_with_errorsдіва при необхідності (що не відображається при використанні :contactmethod_emailметоду). це правильна відповідь!
цезарсол

1

Якщо ви хочете, щоб ім'я_файла було встановлено до будь-якого ідентифікатора, вам слід зателефонувати до помічників форми на об’єкт форми

- form_for(@message) do |f|
  = f.label :email

Це також гарантує збереження будь-яких поданих даних у пам'яті, якщо є помилки перевірки тощо.

Якщо ви не можете викликати метод помічника форми на об’єкті форми, наприклад, якщо ви використовуєте помічник тегу (radio_button_tag тощо), ви можете інтерполювати ім'я за допомогою:

= radio_button_tag "#{f.object_name}[email]", @message.email

У цьому випадку вам потрібно буде вказати значення вручну, щоб зберегти будь-які подання.


0

Використовуючи true/ falseяк значення, поле буде попередньо заповнене, якщо модель, передана формі, вже має цей атрибут:

= f.radio_button(:public?, true)
= f.label(:public?, "yes", value: true)
= f.radio_button(:public?, false)
= f.label(:public?, "no", value: false)

0

Це приклад мого проекту для оцінювання за допомогою radioкнопок та його labels

<div class="rating">
  <%= form.radio_button :star, '1' %>
  <%= form.label :star, '☆', value: '1' %>

  <%= form.radio_button :star, '2' %>
  <%= form.label :star, '☆', value: '2' %>

  <%= form.radio_button :star, '3' %>
  <%= form.label :star, '☆', value: '3' %>

  <%= form.radio_button :star, '4' %>
  <%= form.label :star, '☆', value: '4' %>

  <%= form.radio_button :star, '5' %>
  <%= form.label :star, '☆', value: '5' %>
</div>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.