2010-03-25 5 views
2

Quelle est la meilleure façon de créer dynamiquement un contrôleur dans Rails.Création automatique d'un contrôleur dans les rails

J'ai une classe qui a besoin de générer un tas de contrôleur qui en hérite. Je pourrais juste créer un tas de fichiers dans/app/controllers, mais ils seraient tous essentiellement des fichiers vides. Il doit y avoir un moyen de générer dynamiquement ces classes et de les traiter comme les autres contrôleurs de Rails, par ex. rechargé correctement en mode dev.

J'ai essayé de mettre cela dans une config/initialiseur:

FL.contact_types.each do |contact_type| 
    controller_name = "#{contact_type.pluralize}Controller" 
    Object.const_set(controller_name.to_sym, Class.new(ContactsController)) unless Object.const_defined?(controller_name.to_sym) 
end 

Cela a fonctionné, mais je INTRODUISE le problème de dépendance/reload et obtenir « Une copie de AuthenticatedSystem a été retiré de l'arbre du module, mais est encore active "puisque le ContactsController hérite de ApplicationController qui inclut AuthenticatedSystem.

Est-ce que créer une série de fichiers vides est vraiment la meilleure solution?

Répondre

2

Êtes-vous sûr de vouloir avoir plusieurs contrôleurs? Pouvez-vous avoir un seul contrôleur qui reçoit une valeur pour indiquer comment il se comporte? Vous pouvez également créer un module qui a la fonctionnalité commune et avoir les fichiers de contrôleur vides qui ne font référence qu'au module.

un itinéraire pourrait être utilisé pour passer le type dans:

map.route "/:type_of_contact/:action/:id/, {:controller => :contact_type} 

maintenant dans toutes les actions, dans params vous avez la clé: type_of_contact pour guider votre système.

Vous devez vous assurer que cela se rapproche de la fin de vos itinéraires afin qu'il ne remplace pas l'accès à vos autres contrôleurs.

+0

Il semble que vous vouliez un contrôleur fourre-tout pour un ensemble spécifique d'actions entrantes. –

+0

Eh bien, je pensais que je voulais un contrôleur séparé pour chaque ContactType. Ils sont tous des contacts, mais quelques-uns ont un champ supplémentaire ou deux, donc STI semblait être la bonne voie à suivre. Et cela fonctionne, mais j'essayais juste de contourner tous les contrôleurs qui faisaient exactement la même chose, alors je les ai tous hérités de ContactsController. Je pourrais me débarrasser des contrôleurs supplémentaires, cependant, et faire tout à travers le ContactsController. Je devrais juste définir le type explicitement et je ne pourrais pas utiliser le form_for magic. Je suppose que c'est peut-être encore le chemin à parcourir. Juste différent gâchis. –

+0

Eh bien, je suis allé avec la solution de tout courir tout à travers mon contrôleur de contacts. Je ne l'aime pas, mais il semble qu'il y ait des compromis dans les deux sens. De cette façon, j'ai semblé devoir utiliser moins de hacks. Je suppose que cela dit quelque chose. :) Merci –

Questions connexes