2010-10-11 3 views
0

Je développe un site d'annonces classées qui affichera la même barre latérale sur presque toutes les pages. Une liste de catégories extraites de la base de données.Meilleure pratique pour assécher l'affichage des mêmes données de modèle sur presque toutes les pages

Je trouve moi-même dupliquer le même code dans chaque contrôleur pour ce faire. à savoir

before_filter :load_categories 

Où: load_categories effectue simple

private 

def load_categories 
    @categories = Category.all 
end 

Pas très sec quand vous avez beaucoup de contrôleurs.

Y a-t-il un moyen de sécher ce processus?

Répondre

3

Vous pouvez mettre cela sur ApplicationController, mais honnêtement je recommande contre cela. ApplicationController a tendance à devenir un gros blob gonflé au fil du temps, accumulant des fonctions utilitaires qui ne sont vraiment pas liées, certainement pas SRP. Ça peut devenir moche.

Ce que j'ai fait pour garder les choses au sec est de créer un contrôleur parent dont les contrôleurs peuvent hériter. Mettez votre before_filter dessus et faites en sorte que les contrôleurs utilisant la catégorie associée en héritent.

Peut-être:

class MainPagesController < ApplicationController 
    before_filter :load_categories 

    private 

    def load_categories 
    @categories = Category.all 
    end 
end 

class SomeController < MainPagesController 
    # etc. 
end 

Si votre application est plutôt petite, ne se développera pas de manière significative au fil du temps, et vous ne faites vraiment @categories de charge sur presque toutes vos pages, puis le mettre sur ApplicationController pourrait faire sens. Mais j'ai tendance à pécher par excès de DRYing mon code. Les très petites classes qui ont une fonctionnalité en silos ne sont jamais une mauvaise chose.

0

Vous pouvez mettre def load_categories définition dans ApplicationController et il sera accessible à partir de chaque contrôleur de votre application.
Vous pouvez également mettre before_filter :load_categories dans ApplicationController si vous voulez qu'il soit exécuté pour chaque contrôleur.

Bien que, franchement, cela ne me semble pas être un énorme cas de redondance de code. En fait, appeler simplement Category.all dans chaque action/vue où vous avez besoin de catégories pourrait être plus simple. Puisque les résultats sont mis en cache, il n'y a pas de pénalité de performance.

0

Vous pouvez également placer votre méthode dans ApplicationController et dans votre before_filter.

Si vous voulez éviter dans un contrôleur spécifique, vous pouvez sauter après

Questions connexes