Chechbox multiples dans une boucle for

Bonjour,

je souhaite créer une sorte de formulaire pour indiquer les présences /
absences / convocation de personnes lors d’une réunion.

Mon tableau ressemblerait à ceci:

Nom_entreprise Corps d’état Présent Convoqué
… … checkbox checkbox
… … checkbox checkbox

etc…

Dans ma vue, je fais donc une boucle :
Pour chaque entreprise :
on rajoute une ligne dans le tableau avec les checkbox
EndFor

Voici le code de ma vue :

<% form_tag :action => “create_presence” do %>
<%=puts((“11”*2).to_i/2)%>

<% total = @current_project.project_permissions.count %> <% for member in @current_project.project_permissions do%> "> <%= hidden_field_tag 'member_id[]', member.id %> <%end%>
Entreprise Qualité Diffusion Convoqué Absent
<%= member.company.name %> <%= member.job.name %> <%=check_box_tag "broadcast[]"%> <%=check_box_tag "expected[]" %> <%=check_box_tag "absent[]" %>

<%= submit_tag "Créer le tableau" %> <%end%>

J’essaie de récupérer les valeurs de chaque check box dans mes variables
broadcast[], expected[] et absent[].

Lorsque je vérifie leur contenu, je m’aperçois :

  1. que seuls les cases qui ont été cochées sont stockées
  2. que je sais pas comment récupérer ces valeurs dans mon controlleur.

Des idées ?
Merci d’avance

Nommer tes checkbox avec la référence à l’id du membre comprise dans le
nom,
faire des pseudo-checkbox JavaScript (la checkbox devient un “switch”
pour
un élément qui contient vraiment l’information),
ou
carrément une requête AJAX qui liste les checkbox et construit le
paramètre.
Perso je te recommande la première solution, elle est plus simple,
marche
même sans JavaScript, et se maintient beaucoup plus facilement.

Le problème est simple, il vient du fait que les navigateurs ne sont
censés
envoyer que les checkbox cochées d’un formulaire (sisi).

Michel B.

2009/7/27 Matthieu H. [email protected]

Michel B. wrote:

Nommer tes checkbox avec la référence à l’id du membre comprise dans le
nom,
faire des pseudo-checkbox JavaScript (la checkbox devient un “switch”
pour
un élément qui contient vraiment l’information),
ou
carrément une requête AJAX qui liste les checkbox et construit le
paramètre.
Perso je te recommande la première solution, elle est plus simple,
marche
même sans JavaScript, et se maintient beaucoup plus facilement.

Le problème est simple, il vient du fait que les navigateurs ne sont
censés
envoyer que les checkbox cochées d’un formulaire (sisi).

Michel B.

2009/7/27 Matthieu H. [email protected]

Merci pour cette réponse éclair :wink:
Mais je dois avouer que je suis dans le brouillard la.
Etant encore un bon débutant (rails et le développement web en général),
pourrais-tu éventuellement détailler ? :stuck_out_tongue:

2009/7/27 Matthieu H. [email protected]

Perso je te recommande la première solution, elle est plus simple,

Merci pour cette réponse éclair :wink:
Mais je dois avouer que je suis dans le brouillard la.
Etant encore un bon débutant (rails et le développement web en général),
pourrais-tu éventuellement détailler ? :stuck_out_tongue:

Une solution coté serveur serait de construire un hash de réponses. Tu
sais combien de réponses en checkbox tu attends, tu peux le faire
facilement, en modifiant légèrement le code de ta vue :

       <td class="handle"><%= check_box_tag

“broadcast_#{member.id}[]”%>

Et côté controlleur, ca donnerait un truc comme :

reponses = {}
@current_project.project_permissions.each do |member|
reponses[“broadcast_#{member.id}”] = (params[“broadcast_#{member.id}”]
== ‘1’)
end

Je trouve cette approche plus simple quand on ne veut pas trop
manipuler de javascript et jouer avec le dom. Je te laisse le soin de
l’adapter aux autres cases :wink:


http://fabien.jakimowicz.com

Ok, alors lire un peu de doc concernant les checkbox tout ça ne sera pas
superflu… Laisse-moi demander à un ami pour toi ce qu’il en pense :
http://www.google.fr/search?hl=fr&q=input+checkbox&btnG=Rechercher&meta=

Bonne lecture…

Michel B.

Salut il est parfaitement normal que tu ne récupères dans tes paramètres
que
les id des checkbox cochées. En même temps c’est facile de faire un
traitement, les clés qui n’existent pas n’ont pas été cochées…
Je te conseille
pour tester de faire volontairement “planter” ton action avec un fail
pour visualiser le contenu des paramètres
(méthode rapide) ou bien regarder dans ton log.

Si tu crées tes checkbox dans ta vue avec un tag du style :
<%= check_box_tag “member_expected[#{member.id}]” %>

tu récupéreras dans params[:member_expected] un Hash où les clés
(méthode
keys) sont les ids de tous les membres sélectionnés.

Cdt,
Nicolas B. (Novelys).

Le 27 juillet 2009 15:21, Fabien J. [email protected] a
écrit
:

Nicolas B. wrote:

Salut il est parfaitement normal que tu ne récupères dans tes paramètres
que
les id des checkbox cochées. En même temps c’est facile de faire un
traitement, les clés qui n’existent pas n’ont pas été cochées…
Je te conseille
pour tester de faire volontairement “planter” ton action avec un fail
pour visualiser le contenu des paramètres
(méthode rapide) ou bien regarder dans ton log.

Si tu crées tes checkbox dans ta vue avec un tag du style :
<%= check_box_tag “member_expected[#{member.id}]” %>

tu récupéreras dans params[:member_expected] un Hash où les clés
(méthode
keys) sont les ids de tous les membres sélectionnés.

Cdt,
Nicolas B. (Novelys).

Le 27 juillet 2009 15:21, Fabien J. [email protected] a
écrit
:

Après encore 2 bonnes heures de prise de tête ce matin, je dois avouer
que tu m’as sauvé la vie !!!
Merci à tous pour vos réponses, cela m’a fortement aidé !

Je donne mon code (qui marche xD) au cas où cela pourrait aider de
prochains visiteurs dans la même galère que moi :

Vue :

<% form_for :presence, :url => {:action => “create_presence”} do%>

<% for member in @current_project.project_permissions do %> "> <%end%>
Entreprise Qualité Diffusion Convoqué Absent
<%= member.company.name %> <%= member.job.name %> <%=check_box "presence[#{member.id}]", "broadcast"%> <%=check_box "presence[#{member.id}]", "expected"%> <%=check_box "presence[#{member.id}]", "absent"%>

<%= hidden_field_tag('report', "#{@report.id}") %> <%= submit_tag "Envoyer" %> <%end%>

Contrôleur :

def create_presence
@report = Report.find(params[:report])
params[:presence]
@current_project.project_permissions.each do |member|
@presence = Presence.new(params[:presence][“#{member.id}”])
@presence.report_id = @report.id
@presence.job_id = member.job.id
@presence.save
end

Bonne continuation à vous
Amicalement,