web-dev-qa-db-ja.com

Rails形式のラジオボタンのラベル

私の質問は this one に似ていますが、Railsアプリに関するものです。

ラジオボタンのあるフォームがあり、ラベルを関連付けたいと思います。 labelフォームヘルパーは、フォームフィールドのみをパラメーターとして受け取りますが、この場合、1つのフォームフィールドに複数のラジオボタンがあります。唯一の方法は、手動でラベルを作成し、ラジオボタン用に自動生成されるIDをハードコーディングすることです。誰かがそれを行うためのより良い方法を知っていますか?

例えば:

<% 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>
141
Bryan
<% 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 %>
139
Matt Haley

:valueオプションをf.labelに渡すと、ラベルタグのfor属性が対応するradio_buttonのIDと同じになります。

<% 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タグのラベルを対象とするように設計された:valueオプション

218
John Douthat

Object_nameに任意のIDのプレフィックスを付ける場合、フォームオブジェクトのフォームヘルパーを呼び出す必要があります。

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

これにより、検証エラーなどが発生した場合に、送信されたデータがメモリに保存されます。

フォームヘルパーでフォームヘルパーメソッドを呼び出せない場合、たとえばタグヘルパー(radio_button_tagなど)を使用している場合は、次を使用して名前を補間できます。

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

この場合、送信を保持するには値を手動で指定する必要があります。

1

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
localhostdotdev