Ярлыки для радиокнопок в виде рельсов

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>
Bryan
источник

Ответы:

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' %>. Это правильно устанавливает атрибут «for» тега label, что позволяет щелкнуть метку и выбрать соответствующий переключатель. В ответе выше простое использование labelпомощника приведет к тому, что атрибут «for» будет неверным при создании переключателя с помощью 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 :: FormHelper # label

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

Джон Даутат
источник
5
ну, это может иметь 0 голосов, потому что ответили несколько месяцев спустя, но на самом деле это хороший. Предостережение: вам нужны Rails> = 2.3.3
tokland
3
этот метод также визуализирует field_with_errorsdiv при необходимости (который не отображается при использовании :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)
localhostdotdev
источник
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>
MIA
источник