Beschriftungen für Optionsfelder in Schienenform

147

Meine Frage ist ähnlich wie diese, aber für eine Rails-App.

Ich habe ein Formular mit einigen Optionsfeldern und möchte ihnen Beschriftungen zuordnen. Der labelFormular-Helfer verwendet nur ein Formularfeld als Parameter. In diesem Fall habe ich jedoch mehrere Optionsfelder für ein einzelnes Formularfeld. Die einzige Möglichkeit, die ich sehe, besteht darin, manuell ein Etikett zu erstellen und die ID, die automatisch für das Optionsfeld generiert wird, fest zu codieren. Kennt jemand einen besseren Weg, dies zu tun?

Beispielsweise:

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

Dies erzeugt so etwas wie:

<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

Was ich möchte:

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

Antworten:

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 %>
Matt Haley
quelle
91
Es gibt auch einen anderen Weg: Wenn Sie eine :valueOption an übergeben f.label, tun Sie dasselbe. zB <%= f.label :contactmethod, 'SMS', :value => 'sms' %>. Dadurch wird das Attribut "für" des Etiketten-Tags korrekt festgelegt. Durch Klicken auf das Etikett wird das entsprechende Optionsfeld ausgewählt. In der obigen Antwort führt die einfache Verwendung des labelHilfsprogramms dazu, dass das Attribut "für" falsch ist, wenn das Optionsfeld mit FormBuilder
John Douthat
2
Ich wollte nur sagen, dass ich als Neuling bei Rails diese Antwort gefunden habe, auf die ich immer wieder zurückkomme. Es ist das Geschenk, das immer weiter gibt. Nun, bis ich mich sowieso an die richtige Syntax erinnere ... :)
John Gallagher
Überprüfen Sie dies auch, wenn Sie den checkedWert bedingt setzen möchten stackoverflow.com/a/4708921/429521
Felipe Sabino
8
Für zukünftige Leser hat John Douthat die richtige Antwort auf diese Frage. Diese Antwort ist nicht mehr richtig.
Superleuchte
230

Wenn Sie die :valueOption an übergeben, f.labelwird sichergestellt, dass das forAttribut des Label-Tags mit der ID des entsprechenden Tags übereinstimmtradio_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 %>

Siehe ActionView :: Helpers :: FormHelper # -Label

Die Option: value dient dazu, Beschriftungen für radio_button-Tags anzuvisieren

John Douthat
quelle
5
Nun, dies kann 0 Stimmen haben, weil es Monate später beantwortet wurde, aber eigentlich ist es die gute. Vorsichtsmaßnahme: Sie benötigen Rails> = 2.3.3
tokland
3
Diese Methode rendert field_with_errorsbei Bedarf auch das div (das bei Verwendung der :contactmethod_emailMethode nicht angezeigt wird). Das ist die richtige Antwort!
Caesarsol
1

Wenn Sie möchten, dass dem Objektnamen eine ID vorangestellt wird, sollten Sie Formularhelfer für das Formularobjekt aufrufen:

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

Dies stellt auch sicher, dass alle übermittelten Daten im Speicher gespeichert werden, falls Validierungsfehler usw. auftreten.

Wenn Sie die Formularhilfemethode für das Formularobjekt nicht aufrufen können, z. B. wenn Sie einen Tag-Helfer (radio_button_tag usw.) verwenden, können Sie den Namen interpolieren, indem Sie:

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

In diesem Fall müssen Sie den Wert manuell angeben, um alle Übermittlungen beizubehalten.

James Conroy-Finn
quelle
0

Wenn Sie true/ falseals Wert verwenden, wird das Feld vorab ausgefüllt, wenn das an das Formular übergebene Modell dieses Attribut bereits ausgefüllt hat:

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

Dies ist ein Beispiel aus meinem Projekt für die Bewertung mithilfe von radioSchaltflächen und deren 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
quelle