Curieux de savoir quelle est la méthode utilisée par Rails pour gérer la situation lorsqu'un utilisateur coche plusieurs cases à cocher (avec la même valeur de nom) et qu'il est renvoyé au contrôleur.
Comment vérifieriez-vous si plusieurs éléments ont été sélectionnés, puis divisés sur les valeurs d'ID, etc.
La façon la plus simple de procéder consiste à configurer ces cases à cocher pour qu'elles deviennent 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" />
Manette:
tag_ids = params[:tag_ids]
(Bien sûr, vous utiliseriez probablement des assistants basés sur form_for
Dans la vue, et donc affecter en masse les ID de balise. Ceci est juste l'exemple le plus générique.)
f.check_box :tag_ids, {multiple: true}, 1, nil
Est la bonne réponse:
Voici la raison, il existe une option "multiple: true" qui permet de placer votre entrée dans un tableau. S'il n'y a pas d'option multiple: true, cela ne sera pas autorisé.
En plus de la réponse de Chuck Callebs, j'ai réalisé qu'en envoyant une chaîne vide au lieu de nil
ou false
comme valeur non vérifiée, Rails comprendra pour supprimer les identifiants associés sur une action de mise à jour:
<%= f.check_box :tag_ids, {multiple: true}, tag.id, '' %>
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 pouvez trouver un didacticiel complet sur la "manière Rails" de le faire https://kolosek.com/Rails-join-table/