2009/10/19 Emilien Taque <[email protected]> > > Ca doit se faire de brancher un validateur JS basé sur les validates_ > des modèles avec un peu d'introspection, quelqu'un a déjà fait ça ? > > J'ai pas arrêté de faire des trucs comme ça avant de connaître Rails, en général c'est assez chiant à bien faire parce qu'il vaut mieux éviter de trop charger la mule question requêtes AJAX dans le vent et que ça oblige de faire dans les contrôleurs une méthode de sauvegarde à blanc juste pour tester si les champs sont corrects (qui peut être simplement un paramètre de plus que va attraper la méthode create / update), des calls AJAX déclenchés à chaque modification d'un champ du formulaire qui reçoivent la réponse, listent les champs erronés dans la réponse et agissent en conséquence dans la page. C'est pas infaisable si tu organise bien tes formulaires et si tu fais bien tes validations dans tes modèles, mais dans la plupart des cas c'est pas forcément beaucoup plus ergonomiques que de vérifier les grosses erreurs évidentes sans AJAX (champs vides, champs numériques avec des lettres, etc.), d'envoyer le formulaire en AJAX pendant la soumission et afficher le résultat de la validation quand elle est négative si ça passe pas.
Ceci dit si c'est une demande ferme de tes utilisateurs ça peut être intéressant de faire quelque chose de composite, du genre : 1. ne surveiller que les champs "à risque" (par exemple en leur mettant une classe "validated" ; pour éviter de trop se répéter, tu peux ouvrir les helpers de formulaire de Rails, leur filer un peu d'introspection pour savoir s'il y a des validate sur ce champs dans le model et leur faire avoir la classe validated quand c'est le cas) 2. quand un champs surveillé est modifié, call AJAX sur la cible du formulaire en ajoutant un paramètre "validation" pour dire que c'est à blanc (en mettant toujours le même paramètre "validation", tu peux ne faire qu'un seul callback sur tous les champs qui ont "validated", chopper l'url sur laquelle pointe ton form, sérialiser le contenu du form pour faire ta requête et ajouter le paramètre "validation" dans la foulée pour faire ton call AJAX) 3. le contrôleur reçoit "validation", il lance un create / update dans une transaction (et si ça passe il rollback ; toujours pour ne pas te répéter, tu peux donner faire des méthodes blank_create et blank_update à ActiveRecord::Base qui vont faire un create / update dans une transaction et toujours faire rollback derrière en renvoyant l'objet avec ses erreurs de validation) ; il renvoie un statut 200 si tout va bien, sinon il renvoie un statut 4xx pour dire qu'il y a une erreur dans les paramètres accompagné d'une liste json des erreurs de validation (mappé nom_du_champs: "texte d'erreur" par exemple) 4. un callback sur la méthode AJAX choppe les erreurs de validation dans le json, lit le nom des champs, trouve les champs dans le formulaire, les encadre en rouge (etc.) et ajoute le texte d'erreur dans un span avec une class qui dit "error" (de nouveau si tu t'es bien débrouillé pour faire une mécanique standard la méthode JavaScript qui fait ça devrait être assez facile) Au final ça peut sembler gros et complexe mais ça ne l'est pas tant que ça si tu pense bien réutilisable dès le début. Par contre si tu commence une méthode comme ça en artisanal sur juste un modèle en faisant pas propre dès le début, il faut t'attendre à ce qu'on te demande de généraliser, et dans ce cas tu t'en mordras très probablement les doigts de ne pas avoir fait réutilisable dès le début... Dans tous les cas, ça ne doit en aucun cas remplacer un traitement harmonieux et strict des validations "à la papa" (c'est à dire lors de la "vrai" requête de sauvegarde). Michel Belleville --~--~---------~--~----~------------~-------~--~----~ Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups. Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse [email protected] Pour résilier votre abonnement envoyez un e-mail à l'adresse [email protected] -~----------~----~----~----~------~----~------~--~---
