2009-07-24 7 views
8

Je souhaite partager du code non lié aux vues entre plusieurs contrôleurs dans mon application Rails. Où dans la structure de répertoire dois-je le placer?Où placer le code Rails qui n'est pas un modèle, une vue, un contrôleur ou un assistant?

EDIT: le code en question si quelque chose tous les contrôleurs utilisent pour déterminer comment ils rendent les données du modèle

+0

il n'est pas lié aux entités de base de données, que ce soit (donc pas le code du modèle) –

+1

Les modèles n'ont pas besoin d'être liés à la base de données. Ils représentent simplement les données utilisées par le système, qu'elles soient stockées ou non. – Pesto

+0

Qu'est-ce que c'est? Vous déclarez seulement ce que ce n'est pas, mais pas ce que c'est. – txwikinger

Répondre

8

Si le code est quelque chose comme des modules avec des méthodes d'utilité dans ceux-ci pourraient être placés dans le dossier lib. Vous pouvez également créer une super-classe commune pour certains de vos contrôleurs s'ils partagent un comportement.

Veuillez publier un exemple du type de code auquel vous pensez.

0

Personnellement, je pense que c'est bien, si son contrôleur lié à le mettre dans votre répertoire de contrôleurs, mais, étiqueté comme un module, par exemple. app/controllers/what_am_i_module.rb car il est spécifique à l'application en cours de développement. Lib me semble être un endroit où je voudrais mettre des améliorations de base/core ou des correctifs de singe qui ne sont pas spécifiques à l'application.

5

Si c'est "quelque chose que tous les contrôleurs utilisent", je le placerais dans une classe de base utilisée par tous les contrôleurs. Le "application_controller" vient à l'esprit.

+0

+1 Cela ressemble à application_controller.rb pour moi aussi. – cakeforcerberus

2

J'ai créé des modules en lib pour fournir du code à d'autres classes.

Voici un exemple de module abrégé qui définit les valeurs des vues pouvant être instanciées à partir de différents contrôleurs.

module ControllerDefaultValues 
    def default_value_for_some_controller() 
    @controller_name = "some_controller" 
    end 
end 

Pour l'utiliser, il suffit d'inclure le module dans votre classe:

class SearchesController 
    include ControllerDefaultValues 
    # 
    def search_some_controller 
    default_value_for_some_controller() 
    render(:partial => "search_results") 
    end 
end 

Le principal avantage de cette méthode est qu'il garde votre répertoire contrôleurs axé sur les contrôleurs et votre répertoire modèles axée sur la logique.

0

S'il va être utilisé par tous vos contrôleurs, collez-le dans application_controller.rb

Tous vos contrôleurs héritent de ApplicationController, donc ils vont avoir accès à tous.

Questions connexes