Etichette per pulsanti di opzione in forma di binari


147

La mia domanda è simile a questa ma per un'app Rails.

Ho un modulo con alcuni pulsanti di opzione e vorrei associare loro delle etichette. L' labelhelper modulo accetta solo un campo modulo come parametro, ma in questo caso ho più pulsanti di opzione per un singolo campo modulo. L'unico modo in cui vedo di farlo è creare manualmente un'etichetta, codificando l'ID generato automaticamente per il pulsante di opzione. Qualcuno sa un modo migliore per farlo?

Per esempio:

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

Questo genera qualcosa di simile:

<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

Quello che voglio:

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

Risposte:


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
C'è anche un altro modo: passare :valueun'opzione per f.labelfare la stessa cosa. es <%= f.label :contactmethod, 'SMS', :value => 'sms' %>. Questo imposta correttamente l'attributo "for" del tag label, che fa clic sul pulsante di selezione dell'etichetta selezionando il pulsante di opzione appropriato. Nella risposta sopra, semplicemente usando l' labelhelper si verificherà che l'attributo "for" non è corretto quando si crea il pulsante di opzione con FormBuilder
John Douthat

2
Volevo solo dire che come nuovo arrivato in Rails, ho trovato questa risposta in cui continuo a tornare. È il dono che continua a dare. Bene, finché non mi ricordo comunque la sintassi corretta ... :)
John Gallagher,

controlla anche questo se stai cercando di impostare il checkedvalore in modo condizionale stackoverflow.com/a/4708921/429521
Felipe Sabino

8
Per i futuri lettori, John Douthat ha la risposta corretta a questa domanda. Questa risposta non è più corretta.
superluminario,

230

Passare l' :valueopzione a f.labelassicurerà che l' forattributo del tag label sia lo stesso dell'ID del corrispondenteradio_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 %>

Vedi l' etichetta ActionView :: Helpers :: FormHelper #

l'opzione: value, progettata per indirizzare le etichette per i tag radio_button


5
beh, questo può avere 0 voti perché è stato risposto mesi dopo, ma in realtà è quello buono. Avvertenza: è necessario Rails> = 2.3.3
tokland

3
questo metodo field_with_errorsesegue anche il rendering del div quando necessario (che non viene visualizzato quando si utilizza il :contactmethod_emailmetodo). questa è la risposta corretta!
Caesarsol,

1

Se si desidera che il nome_oggetto abbia il prefisso su qualsiasi ID, è necessario chiamare gli helper del modulo sull'oggetto modulo:

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

Ciò garantisce inoltre che tutti i dati inviati vengano archiviati in memoria in caso di errori di convalida, ecc.

Se non puoi chiamare il metodo helper del modulo sull'oggetto modulo, ad esempio se stai usando un helper tag (radio_button_tag ecc.) Puoi interpolare il nome usando:

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

In questo caso dovrai specificare il valore manualmente per preservare eventuali invii.


0

Usando true/ falsecome valore il campo sarà precompilato se il modello passato al modulo ha già questo attributo riempito:

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

0

Questo un esempio dal mio progetto per la valutazione tramite radioi pulsanti e le sue 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.