2010-11-22 7 views
2

Lorsqu'un utilisateur soumet sans case cochée. J'ai besoin de mon ODM (Mongoid) pour mettre à jour le dossier de manière appropriée.Aide avec les cases à cocher

Avoir un peu de mal avec:

<% Notification.all.each do |notification| %> 
    <li> 
     <%= check_box_tag 'user[notification_ids][]', notification.id, @user.notifications.include?(notification) %> 
     <%= label_tag notification.description %> 
    </li> 
    <% end %> 

Le doc suggère que l'aide de check_box met dans une entrée cachée. Le champ masqué a le même nom et ses attributs imitent une case à cocher non cochée. Cependant, avec le code ci-dessus. Je traverse une boucle. Ce qui est légèrement différent.

J'ai essayé:

<%= check_box('user_notification_ids_', '', options = {:index => notification.id, :checked => @user.notifications.include?(notification)}, checked_value = "1", unchecked_value = "0") %> 

Mais chaque fois que je soumets, je reçois: format ObjectId illégal

Ou devrais-je créer la balise cachée pour notification_ids manuellement? Quelque chose comme:

<%= hidden_field_tag 'user[notification_ids][]', '[]' %> 

Vous cherchez à entendre vos commentaires

Répondre

1

Accédez à la première boucle que vous avez incluse. Il semble beaucoup plus simple et ressemble à la même chose.

Si je comprends bien votre première phrase, il semble que les notifications de l'utilisateur ne soient pas mises à jour lorsqu'elles décochent toutes les cases. Si aucune case n'est cochée, le navigateur n'enverra pas ce paramètre. Il ne sera pas tout simplement inclus dans params donc quand vous faites quelque chose comme:

@user.update_attributes(params[:user]) 

... notifications ne seront pas mis à jour. Dans votre contrôleur, faites ceci pour assurer qu'il ya quelque chose pour mettre params[:user][:notifications]:

params[:user][:notifications] ||= [] 

Ceci est le mettra à un tableau vide s'il si elle n'existe pas et/ou il n'y a pas de valeur là-bas. Cela garantit que update_attributes le définira sur none/empty.

+0

Oui, c'est comme ça que je l'ai actuellement mis en place. Le problème est lorsque l'utilisateur ne sélectionne aucune case. Rien n'est soumis avec le formulaire. Dans mon contrôleur, je pourrais avoir quelque chose comme: params [: user] = {: notification_ids => []} si params [: user] .blank? Cependant, c'est un peu plus compliqué que ça. Depuis que j'ai deux ensembles de notifications dans deux pages différentes (Page A et Page B). –

+0

Cela signifie que si l'utilisateur a des notifications vérifiées sur la première page. Sur la deuxième page, si l'utilisateur ne sélectionne aucune case à cocher et que le formulaire est envoyé, il sera défini sur none/empty pour TOUTES les notifications. Pas seulement pour les notifications sur la page B (deuxième page), mais aussi pour les notifications sur la première page. –

+0

Si vous avez la moitié des cases à cocher sur une page et la moitié sur l'autre et qu'ils utilisent le même nom de paramètre, alors vous avez un problème (comme vous le mentionnez). Vous devrez utiliser deux noms de paramètres différents pour qu'une page n'efface pas les sélections de case à cocher de l'autre page. Quelque chose comme params [: user] [: page1_check] et params [: user] [: page2_check], puis mappez manuellement ceux-ci aux attributs du modèle utilisateur. Votre tâche sera simple si vous mettez tout sur une seule page. – Georges

1

ne génère aucun champ caché. check_box fait, mais en regardant votre situation, je pense que l'utilisation est plus appropriée puisque la méthode check_box est principalement utilisée pour le champ booléen. Voici une façon de le faire.

<%= hidden_field_tag 'user[notification_ids][]' %> 
<% Notification.all.each do |notification| %> 
    <li> 
    <%= check_box_tag 'user[notification_ids][]', notification.id, @user.notifications.include?(notification) %> 
    <%= label_tag notification.description %> 
    </li> 
<% end %> 

Lorsque le formulaire est transmis avec les cases de Notification d'id 2 et 3 vérifié, la valeur de params[:user] est { "notification_ids" => ["", "2", "3"] }. Lorsque rien n'est vérifié, params[:user] est {"notification_ids"=>[""]}, ce qui effacera les notifications de l'utilisateur. Cela fonctionne parce que empty string is ignored by ActiveRecord. De là, nous pouvons utiliser le @user.update_attributes(params[:user]) habituel pour mettre à jour le modèle d'utilisateur.

+0

Mon commentaire (s) pour Georges s'applique ici aussi bien. Veuillez regarder ci-dessus :-) –

+0

@ Christian Fazzini, j'ai mis à jour ma réponse pour prendre soin de cela. Un 'hidden_field_tag' est ajouté en haut pour permettre aux notifications d'être effacées. – htanata

+0

Salut Htanata, j'ai essayé comme vous l'avez suggéré avec <% = hidden_field_tag ​​'utilisateur [notification_ids] []'%>. Je reçois l'erreur suivante: "format ObjectId illégal". Je crois que c'est parce que le formulaire le soumet comme "user" => {"notification_ids" => [""]} au lieu de "user" => {"notification_ids" => []}.Existe-t-il un moyen de le soumettre sans les doubles guillemets dans [], en tant que tels: "user" => {"notification_ids" => []}? –