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
Je pense que vous êtes mort. Des idées pour travailler autour d'elle? – justinbach
Vous pouvez tester pour voir si la clé: d'enregistrement existe dans le hachage, et si non, faites la chose no-checked-boxes. – Fred
Merci, Fred - c'est ce que j'ai fait et ça marche parfaitement! – justinbach