2010-12-13 51 views

Répondre

48

La meilleure façon de le faire est de mettre les cases à cocher pour devenir un tableau.

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] 

(Bien sûr, vous seriez probablement en utilisant form_for aides à base dans la vue, et donc l'attribution de masse-les ID d'étiquette Ce. est juste l'exemple le plus générique.)

+0

Qu'advient-il si l'utilisateur désélectionne une case à cocher? Tag_ids [] serait-il soumis en tant que tableau vide? –

+4

@Joe Van Dyk: si aucune valeur nommée 'tag_ids []' n'est soumise dans la requête HTTP, Rails ne pensera pas à mettre 'tag_ids' dans' params'. Vous devrez en tenir compte vous-même, par exemple 'params [: tag_ids] || = []' – Matchu

+8

Pour obtenir ce code HTML, vous pouvez faire 'f.check_box: tag_ids, {multiple: true}, 1, nil' . Le 'nil' signifie" sans une entrée 0 cachée ". Ce genre de chose est mal documenté. –

-2

Si vous voulez utiliser un checked param, vous devez écrire ceci:

check_box_tag "tag_ids[]", 1, true 

Et pas:

check_box_tag 'tag_ids[]', 1, true 

Il m'a fallu un certain temps pour comprendre, je l'espère aider quelqu'un.

+0

Donc, vous dites que les guillemets simples '' 'versus les guillemets doubles' "" font une différence ici? –

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

est la bonne réponse:

est ici la raison, il y a un « multiple: true » option qui permet à votre entrée à placer dans un tableau. S'il n'y a pas d'option multiple: true, cela ne sera pas autorisé.

0

Voici un exemple de vue et de contrôleur par exemple où plusieurs nettoyeurs peuvent être dans plusieurs villes.

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

Et dans le contrôleur

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

Vous trouverez tutoriel complet sur « rails chemin » de le faire https://kolosek.com/rails-join-table/