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

Répondre à