2009-06-15 5 views
0

J'ai quelques objets qui sont incroyablement similaires. En fait, ils utilisent STI et stockent toutes les données dans la même table dans la base de données. Actuellement, chaque fois que j'ajoute une fonctionnalité ou que je corrige un bug, je dois le mettre à jour à 3 endroits différents, donc je voudrais SECRETER mon code un peu. La duplication de code la plus courante est dans les vues. J'ai vu des gens en utilisant render :template => 'shared/something' pour rendre leurs points de vue communs, le problème est, j'ai beaucoup d'entre eux, mais seulement pour un objet particulier (Envois), donc je préférerais quelque chose comme render :template => 'shipments/shared/something' ou render :template => 'abstract_shipments/something'. Plus important encore, je voudrais que l'une des classes réelles soit en mesure de remplacer le modèle s'il le faut.Rails - Vues abstraites/partagées

Avez-vous des suggestions pour y parvenir? Merci beaucoup pour vos réponses!

Répondre

1

Le plug-in inherit_views peut faire l'affaire: http://github.com/ianwhite/inherit_views/tree/master. Je l'ai utilisé avec succès avant. Vous pouvez alors avoir une classe de contrôleur de base commune pour tous les contrôleurs devant effectuer des livraisons et avoir des modèles communs dans le dossier views de ce contrôleur de base avec des remplacements spécifiques dans les dossiers de vues des contrôleurs individuels.

+0

Merci, cela ressemble exactement à ce dont j'ai besoin! –

0

Les classes (au moins les modèles) ne savent pas ou ne devraient pas savoir quoi que ce soit sur la façon dont elles sont affichées. C'est fondamental pour la séparation des préoccupations fournies par le modèle MVC.

Je pense que je vais essayer quelque chose comme ceci:

Utilisez un contrôleur unique pour tous les modèles STI, ShipmentsController ou quelque chose de similaire. Hormis cela semble logique, tous vos points de vue finiront au même endroit, ce qui devrait aider. En ce qui concerne les vues, que diriez-vous d'un "principal" pour les parties communes, et un partiel pour chaque ensemble de champs spécifiques à la sous-classe? Utilisez un case dans votre point de vue, ou probablement plus propre, une méthode d'aide, quelque chose comme

def partial_name_for_subclass(obj) 
    if obj.is_a?(CrudeOilShipment) # or kind_of? or test the type column or use respond_to? 
    'crude_oil_shipment' 
    # etc 
    end 
end 

Sécheuse, envisagez d'utiliser une convention (Rails aime conventions):

<%= render :partial => @shipment.class.name.downcase, :locals => { :item => @shipment } %> 

où vous avez une partielle pour chaque sous-classe.

J'espère que cela aide/a du sens ...