Le Ven 15 septembre 2006 16:54, Jean-François a écrit : > class FooController < AC::B > filters_and_conditions # avec arguments eventuels > end
C'est la méthode "à la ActiveRecord" mais globalement ce n'est pas un pattern à suivre. Ici, par exemple, ça coupe la hiérarchie avec le ApplicationControler qui devrait être la racine des contrôleurs. De plus ça commence à ne plus être de la méta programmation mais plus de la "magie". Pire, ça n'est même pas plus compréhensible. Perso je vois quelques cas : - tu as seulement quelques méthodes, autant les ajouter directement dans le ApplicationControler plutot que de faire une classe et/ou un module à part. - tu as une paire de méthodes, mais qui restent vraiment liées au controleur, et dans ce cas tu peux les mettre dans une classe X qui hérite de ApplicationControler et demander à tes controleur d'hériter de X plutot que de ApplicationControler - tu as une paire de méthodes qui ne te paraissent vraiment pas appartenir au contrôleur et qui n'utilisent pas grand chose du contrôleur. Dans ce cas tu peux utiliser le très moche binding_of_caller, qui te permet d'utiliser .. hum .. les variables de la méthode appelante. Oui, c'est très gruik, mais au moins ça me parait moins moche que l'enchantement des classes à la ActiveRecord. Le coté gruik reste dans ce qu'on rajoute et ne vient pas s'implanter dans la base classique de ton application (le controleur). - tu as une paire de méthodes qui ne te paraissent vraiment pas appartenir au contrôleur et qui n'utilisent pas grand chose du contrôleur et tu te refuses aux gruikeries. Dans ce cas le plus simple est encore d'effectivement passer ce dont tu as besoin en paramètre. Donc récupérer ta session, et l'envoyer à ton objet ou singleton Filters_and_conditions. Ca me parait d'ailleurs la solution la plus logique et c'est loin d'être la plus moche. Pour courroner le tout c'est aussi la solution la plus "classique", celle qu'on ferait dans tous les autres langages. - Tu as beaucoup de méthodes et qui utilisent beaucoup de choses dans ton contrôleur mais qui ne sont pas des méthodes appartenant à un controleur. Il te reste effectivement la voie du module, mais plutot que de chercher des enchantement, je te conseille vraiment de garder la syntaxe habituelle des modules. Ca ne te prendra qu'une seule ligne (le include) mais surtout ça ne pourrira pas ta hiérarchie de classe et ne sera pas inutilement "magique". A priori, de ce que j'ai vu, ce que je te conseille c'est : - Ajouter un accesseur de classe pour gérer @@session dans ta classe Filters_and_conditions - Ajouter bêtement une méthode filters_and_conditions à ton ApplicationControler. Cette méthode ira prendre la classe Filters_and_conditions, enregistrer l'objet de session dedans (grace à l'accesseur), et te retourner la classe. Au final au lieu de faire Filters_and_conditions.init(:page) dans tes controleurs tu feras filters_and_conditions.init(:page). Ce n'est pas une grande différence et ça sera suffisament simple, pas trop magique. -- Eric Daspet _______________________________________________ Railsfrance mailing list Railsfrance@rubyonrails.fr http://lists.rubyonrails.fr/mailman/listinfo/railsfrance