2010-03-25 5 views
0

Je fais des travaux de maintenance sur un site de rails existant et j'ai rencontré un bug étrange. Il y a quelques modèles différents impliqués ici: Registrations, Business Categories, et Services. Registrations HABTM Business Categories et Services, dont chacun HABTM Registrations. Les tables de jointures non-clés-clés appropriées existent pour chacune des relations HABTM.Rails: les enregistrements HABTM ne sont pas supprimés correctement

Il existe un seul formulaire avec deux sections (une pour les catégories d'entreprise et une pour les services) que les utilisateurs remplissent pour mettre à jour leurs enregistrements. Chacune des deux sections comporte plusieurs cases à cocher, une pour chaque catégorie d'activité potentielle et une pour chaque service. Par exemple, le HAML qui génère les cases à cocher catégorie d'affaires est la suivante:

- BusinessCategory.find(:all, :order => ['business_type']).each do |business_category| 
     %li 
     = check_box_tag "registration[business_category_ids][]", business_category.id, (@registration.business_categories.include?(business_category)) ? true : false 
     = business_category.business_type 

Dans la fonction de mise à jour du contrôleur Registrations:

@registration = current_user.registration 
    if @registration.update_attributes(params[:registration]) 
    flash[:notice] = "Company Successfully Updated." 
    redirect_to :action => 'edit_company' 
    else 
    ... do appropriate error reporting and redirection ... 

En général, tout fonctionne bien. Les utilisateurs peuvent s'inscrire avec autant ou aussi peu de cases cochées qu'ils le souhaitent, et les catégories et services d'affaires de leur inscription reflètent les cases cochées. Les modifications ultérieures fonctionnent également, pour la plupart. Cependant, si à tout moment les utilisateurs désélectionnent toutes les cases d'une partie donnée (catégories biz ou services) du formulaire, aucun des changements apportés à cette partie du formulaire n'est sauvegardé. Il n'y a aucun message d'erreur, et le flash "Company Successfully Updated" apparaît toujours, mais les cases restent cochées même si elles n'ont pas été cochées avant que le formulaire ne soit envoyé.

Si je reconstruisais/refactorisais le site, je serais plus susceptible d'utiliser has_many :through plutôt que HABTM, mais notre budget ne me donne pas assez de temps pour cela. Est-ce que quelqu'un a des idées sur les raisons pour lesquelles HABTM semble avoir du mal à se laisser aller?

Merci de votre considération!

Justin

Répondre

0

Si une case à cocher est pas sélectionnée, le navigateur n'envoie rien de nouveau pour ce champ. Rails contourne ce problème en incluant un champ caché avec le même nom que la case à cocher. Rails récupère alors soit le champ caché seul (case non cochée) soit les deux champs (case cochée). Le gotcha est que cela ne fonctionne pas pour les tableaux de champs de case à cocher. Je ne suis pas sur mon HAML, mais je pense que c'est votre problème, et que si aucune case n'est cochée, il n'y a pas de clé :registration dans le hachage params, et donc rien n'est mis à jour.

Voir the API ref.

+0

Je pense que vous êtes mort. Des idées pour travailler autour d'elle? – justinbach

+0

Vous pouvez tester pour voir si la clé: d'enregistrement existe dans le hachage, et si non, faites la chose no-checked-boxes. – Fred

+0

Merci, Fred - c'est ce que j'ai fait et ça marche parfaitement! – justinbach

Questions connexes