私の質問は 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>
<% 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 %>
: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オプション
Object_nameに任意のIDのプレフィックスを付ける場合、フォームオブジェクトのフォームヘルパーを呼び出す必要があります。
- form_for(@message) do |f|
= f.label :email
これにより、検証エラーなどが発生した場合に、送信されたデータがメモリに保存されます。
フォームヘルパーでフォームヘルパーメソッドを呼び出せない場合、たとえばタグヘルパー(radio_button_tagなど)を使用している場合は、次を使用して名前を補間できます。
= radio_button_tag "#{f.object_name}[email]", @message.email
この場合、送信を保持するには値を手動で指定する必要があります。
true
/false
を値として使用すると、フォームに渡されたモデルにこの属性がすでに入力されている場合、フィールドに事前入力されます。
= f.radio_button(:public?, true)
= f.label(:public?, "yes", value: true)
= f.radio_button(:public?, false)
= f.label(:public?, "no", value: false)