2010-01-12 6 views
1

J'ai un contrôleur qui a deux actions: "show", "show_modify". Ceux-ci ont des vues très similaires mais légèrement différentes, c'est-à-dire show_modify a différentes classes div, a des liens/boutons supplémentaires et ainsi de suite.Rails: Quelle est la meilleure façon de séparer deux vues très similaires?

D'après ce que j'ai vu il y a quelques façons d'aborder ce dans des rails:

  1. faire un modèle pour les deux et juste ajouter des conditions à l'intérieur:

    <% if param[:action]=="show_modify"> <% ... %> <% end %> 
    

    pourtant il y a tant de différences que cela semble très laid et répétitif, et est-ce aussi une sorte de violation de la séparation de l'église et l'état (je ne suis pas un expert MVC ...)

  2. Le chemin partiel: Pour chaque élément affiché différemment, créez deux partiels, un pour chaque action. Les vues ressemblerait à quelque chose comme ceci:

    # show_modify 
    render :partial '_general_stuff' 
    render :partial => '_blabla_show_modify' 
    
    # show 
    render :partial => '_general_stuff' 
    render :partial => '_blabla_show' ` 
    

    Pourtant, ce contreviendra à SEC, parce qu'il ya des éléments qui se chevauchent. Je peux continuer à faire plus de sous-partiels, mais c'est essentiellement des tortues tout le long - finalement vous devez aller si/sinon si vous ne voulez pas vous répéter.

  3. Partials avec les habitants:

    if show 
        render :partial = '_blabla', :locals => {:bckgrnd => 'blue', :button => 'yes' ....} 
    

    mais ceci est une autre solution beaucoup-o-ifs ....

Les meilleures options là-bas? content_for peut-être? Je suis un peu un Rails noob +, donc j'ai peut-être manqué quelque chose complètement ....

Répondre

0

De votre description, les deux vues ne semblent pas très similaires, tout au long de la vue complète toutes sortes d'exceptions sont faites. D'où votre problème avec les nombreuses instructions if ou partials qui ne fonctionnent pas.

N'est-il pas possible de refactoriser vos vues de telle sorte qu'elles correspondent mieux? Par exemple, gardez les mêmes noms de classe div et changez de CSS en fonction de votre vue. Ensuite, en utilisant la méthode des vues partielles pourrait fonctionner beaucoup plus agréable. Surtout si vous déplacez également les liens (bouton Envoyer?) En dehors de cette vue partielle et le placez dans la vue show_modify.

0

Si les différences sont très petites, vous pouvez utiliser votre première idée, mais je préfère faire des aides:

def show_modify? 
    param[:action] == "show_modify" 
end 

puis dans les vues:

<% if show_modify? %> 
    some html 
<% end %> 
... 
<%= link_to "something", some_path if show_modify? %> 

et ainsi de suite.

En cas de classes de divs j'utiliser des méthodes d'aide pour générer le nom de classe:

def set_class 
    return "first_class" if show_modify? 
    "second_class" 
end 
+0

Je n'étais pas au courant de la construction <% link_to .. if ..%>. C'est très lisible et produit beaucoup moins d'encombrement ... Merci! –

0

Essayez extension l'objet comme un modèle de vue. Cela est très courant dans ASP.NET MVC, lorsque vous souhaitez étendre un objet de domaine avec des choses qui n'ont rien à voir avec le domaine métier.

class User < ActiveRecord::Base 
    # id, integer 
    # first_name, string 
    # last_name, string 
    # only put the business-y stuff here. validations, etc. 
end 

class ShowUserViewModel < User 
    def background_color 
    "#0000ff" 
    end 

    def template 
    "show" 
    end 
end 

class EditUserViewModel < User 

    def background_color 
    "#00ff00" 
    end 

    def template 
    "show_modify" 
    end 
end 

À partir de votre contrôleur, en fonction de l'action entreprise, renvoyez l'objet approprié. Les modèles de vue sont toujours des "Utilisateurs", mais ils sont complétés avec plus d'informations nécessaires pour la vue. Cela peut vraiment garder beaucoup de structures if et for hors de vue.

+0

Ce n'est pas une méthode très propre, car les modèles doivent être utilisés pour saisir des données (à partir d'une base de données, par exemple) afin qu'ils puissent être utilisés dans une vue. Une solution plus propre consiste à utiliser les méthodes Helper et à ajouter dynamiquement leurs fonctionnalités au contrôleur en fonction de la vue – Veger

0

Je suis dans une situation similaire. J'envisage de prendre mon point de vue et de le séparer en deux points de vue complètement différents. C'est probablement la meilleure option s'il est logique que les deux vues deviennent de plus en plus dissemblables en vieillissant puisque les deux nouvelles vues seront complètement découplées. Si vous voulez que les segments significatifs de la vue restent identiques entre show et show_modify, cette approche est probablement moins utile ...

Questions connexes