2010-12-13 6 views

risposta

48

Il modo più semplice per farlo è quello di impostare le caselle di controllo fino a diventare un array.

HTML:

<input type="checkbox" name="tag_ids[]" value="1" /> 
<input type="checkbox" name="tag_ids[]" value="2" /> 
<input type="checkbox" name="tag_ids[]" value="3" /> 

Controller:

tag_ids = params[:tag_ids] 

(Naturalmente, si sarebbe probabilmente essere utilizzando form_for aiutanti basati nella vista, e quindi di massa assegnando gli ID Tagga questo. è solo l'esempio più generico.)

+0

Cosa succede se l'utente deseleziona una casella di controllo? Tag_ids sarebbe stato inviato come array vuoto? –

+4

@Joe Van Dyk: se nessun valore chiamato 'tag_ids []' viene inviato nella richiesta HTTP, allora Rails non penserà a mettere 'tag_ids' in' params'. Dovrai tenerne conto personalmente, ad esempio, 'params [: tag_ids] || = []' – Matchu

+8

Per ottenere questo codice HTML, puoi fare 'f.check_box: tag_ids, {multiple: true}, 1, nil' . Il 'nil' significa" senza un input 0 nascosto ". Questo genere di cose è scarsamente documentato. –

-2

Se si desidera utilizzare un parametro checked, è necessario scrivere questo:

check_box_tag "tag_ids[]", 1, true 

E non questo:

check_box_tag 'tag_ids[]', 1, true 

Mi c'è voluto un po 'per capire, spero che aiuterà qualcuno.

+0

Quindi stai dicendo che le virgolette singole "" rispetto alle virgolette doppie "" fa la differenza qui? –

14
f.check_box :tag_ids, {multiple: true}, 1, nil 

è la risposta giusta:

Ecco la ragione, c'è un 'multipla: true' opzione che consente l'input ad essere immessi in un array. Se non c'è un multiplo: opzione true questo non sarà permesso.

0

Ecco un esempio di visualizzazione e controller, ad esempio dove più pulitori possono trovarsi in più città.

<%= form_for(@cleaner) do |f| %> 
    <p> 
    <%= f.label :cities %><br /> 
    <% for city in City.all %> 
     <%= check_box_tag "cleaner[city_ids][]", city.id, @cleaner.cities.include?(city) %> 
     <%=h city.name %><br /> 
    <% end %> 
    </p> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

E controller

def cleaner_params 
    params.require(:cleaner).permit(city_ids: []) 
end 

Potete trovare tutorial completo su "rotaie modo" di fare questo https://kolosek.com/rails-join-table/

Problemi correlati