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]
-~----------~----~----~----~------~----~------~--~---

Répondre à