Ярлыки для переключателей в рельсах

Мой вопрос похож на этот но для приложения 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>

Ответ 1

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

Ответ 2

Передача параметра :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

параметр: значение, которое предназначено для целевых ярлыков для тегов radio_button

Ответ 3

Если вы хотите, чтобы имя_объекта, префиксное к любому ID, вы должны вызывать бланки формы формы на объекте формы:

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

Это также гарантирует, что любые представленные данные будут сохранены в памяти, если будут какие-либо ошибки проверки и т.д.

Если вы не можете вызвать метод-помощник формы в объекте формы, например, если вы используете помощник тега (radio_button_tag и т.д.), вы можете интерполировать имя, используя:

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

В этом случае вам нужно будет указать значение вручную, чтобы сохранить любые представления.