2013-04-09 7 views
10

Ho un modello MyModel con un attributo serializzato a, che descrive una serie di simboli.Visualizzare un elenco di caselle di controllo invece di selezionare più

Questo codice funziona:

<% form_for @my_model do |f| %> 
    <%= f.select :a, MyModel::AS, :multiple => true) %> 
<% end %> 

I parametri sono corretti:

{ :my_model => { :a => [:a_value1, :a_value2] } } 

voglio trasformare questo multipla selezionare in una serie di caselle di controllo, in questo modo:

<% form_for @my_model do |f| %> 
    <% MyModel::AS.each do |a_value| 
    <%= f.check_box(:a_value) %> 
    <% end %> 
<% end %> 

Funziona anche, ma i parametri non sono affatto gli stessi:

{ :my_model => { :a_value1 => 1, :a_value2 => 1 } } 

penso a 2 soluzioni per tornare alla prima soluzione ...

  • trasformare la mia check_box in , sostituire selezione multipla, e aggiungere un po javascript per 'controllare' selezionare i valori quando l'utente clicca su check_box_tags. Quindi, il parametro sarà lo stesso direttamente nel controller.
  • Aggiungere un codice litte nel controller per "adattare" i miei parametri.

Quale soluzione è la meno brutta? O c'è un altro?

risposta

28

Ho trovato una soluzione, utilizzando l'opzione "multiplo" che non conoscevo.

<% MyModel::AS.each do |a_value| %> 
    <%= f.check_box(:a, { :multiple => true }, a_value) %> 
<% end %> 

I parametri dei risultati sono un po 'strani, ma dovrebbe funzionare.

{"my_model" => { "a" => ["0", "a_value1", "0", "a_value2", "0"] } 

Modifica dal @Viren: passando nil alla fine della funzione come

<%= f.check_box(:a, { :multiple => true }, a_value, nil) %> 

funziona perfettamente.

+7

Passare 'nil' alla fine e funzionerebbe come controllo previsto [questo] (http://apidock.com/rails/ActionView/Helpers/FormHelper/check_box) – Viren

+0

@Viren Grazie del suggerimento. – pierallard

+1

Modifica la tua risposta se vuoi, c'è anche un errore di battitura lì. Dopo '<% MyModel :: AS.each do | a_value |' need '%>'. Sto solo dicendo – ksugiarto

3

Si può fare in questo modo:

<% MyModel::AS.each do |a_value| %> 
    <%= f.check_box("a[]", a_value) %> 
<% end %> 

Questo renderà params vengono ricevuti dal server come segue

{ :my_model => { :a => [:a_value1, :a_value2] } } 
3

c'è un'altra soluzione pena ricordare che lo rende molto facile da inserire record nella database se si dispone di una relazione has_and_belongs_to_many o has_manythrough utilizzando l'helper modulo collection_check_boxes.

<%= f.collection_check_boxes :mymodel_ids, MyModel::AS, :id, :name do |m| %> 
    <%= m.check_box %> <%= m.label %> 
<% end %> 

Poi, nel controller avremmo consentire l'attributo mymodel_ids:

params.require(:mymodel).permit(:name, mymodel_ids:[]) 

Possiamo anche impostare una validazione dei modelli di esigere che almeno una delle caselle di controllo essere controllati:

validates :mymodel_ids, presence: true 

Un ulteriore vantaggio di questo metodo è che se in seguito si modifica il record mymodel e si deseleziona una delle caselle di controllo, il suo record verrà eliminato dalloTabella di associazionesu save.