2011-02-13 3 views
0

J'utilise des contrôleurs à espaces de noms qui héritent également d'un contrôleur parent. Dans chaque sous-classe je dois avoir (for anyone wondering why...):Comment obtenir le nom de contrôleur d'un contrôleur sous-classé à partir de son parent?

class Fruits::ApplesController < FruitsController 
    # controller_name below is 'apples' 
    require_dependency "fruits/#{controller_name}" 
    ... 
end 

, puisque je préfère avoir la ligne require_dependency une fois dans ma classe parente j'ai essayé de le déplacer vers FruitsController, mais le problème est que nom_contrôleur est maintenant égal à « fruits » ..

class FruitsController < ApplicationController 
    # controller_name is 'fruits' no matter which subclassed controller is called 
    require_dependency "fruits/#{controller_name}" 
    ... 
end 

alors, comment puis-je obtenir correctement la valeur du nom du contrôleur dans FruitsController sous-classé, pour que je puisse garder cette ligne require_dependency de mes sous-classes? controller_path n'aide pas non plus.

Merci!

Répondre

0

Comme je l'ai mentionné ci-dessus dans ma réponse à @ElliotNelson, voici le code que je l'ai mis dans mon FruitsController qui m'a permis de re-facteur mon code d'origine:

def self.inherited(subclass)  
    subclass.require_dependency subclass.controller_name 
    super 
end 
0

L'instruction require ci-dessus dans la classe Fruits est exécutée une seule fois lors du chargement de la classe parent, ce qui signifie que les sous-classes ne l'exécuteront plus. Consultez l'exemple suivant:

class A 
    puts name 
end 

class B < A 
end 
#=> A 

Donc, vous devez exécuter un besoin séparé par la sous-classe et donc vous ne pouvez pas factoriser cette façon que vous voulez.

+0

merci pour l'explication @khelll – Carter

2

Comme écrit, votre instruction "require_dependency" n'est exécutée qu'une seule fois, lorsque le parent est chargé.

Vous pourriez potentiellement utiliser la méthode héritée de classe # pour exiger votre dépendance, comme ceci (code non testé). (Merci beaucoup BTW)

class FruitsController < ApplicationController 
    def self.inherited(subclass) 
    subclass.require_dependency subclass.to_s.underscore 
    end 
end 
+0

Génial, merci beaucoup! J'ai dû ajouter un appel à 'super' à la fin pour que cela fonctionne, et j'ai choisi d'utiliser' subclass.controller_name' au lieu de 'subclass.to_s.underscore' car il retourne ce dont j'ai besoin (déjà souligné et non _controller à la fin, donc cela correspond au nom du modèle). Je posterai le code de travail ci-dessous ... – Carter

Questions connexes