2010-11-03 2 views
1

J'ai une liste de livres qui affiche des boutons d'édition et un tas d'informations supplémentaires si l'utilisateur qui est connecté est un administrateur. En ce moment j'ai deux partis partiels séparés qui sont rendus selon quel type d'utilisateur est connecté. J'avais l'habitude d'avoir juste un partiel avec un tas de si user.admin? déclarations, mais il a commencé à devenir vraiment laid. Maintenant, je suis en train de jongler avec deux fichiers, avec des petits morceaux de données en double dans chacun. Y a-t-il une meilleure façon de faire cela?Aidez-moi à refactoriser mes vues d'utilisateurs admin par rapport aux vues des utilisateurs non administrateurs

index.html.erb

<ul> 
    <% if @current_user.admin? %> 
    <%= render :partial => "book", :collection => @books %> 
    <% else %> 
    <%= render :partial => "non_admin_book", :collection => @books %> 
    <% end %> 
</ul> 

_book.html.erb

Title: <%= book.title %> EDIT BUTTON 
<!-- Awesome extra info for admins --> 
Author: <%= book.author %> 
<!-- Awesome extra info for admins --> 

_non_adminbook.html.erb

Title: <%= book.title %> 
Author: <%= book.author %> 

Répondre

3

Cette question est comme: dois-je utiliser seulement I18n touches sur une partie/vue partielle ou devrais-je utiliser X vues/partiels pour chaque langue?

Il n'y a pas de bonne ou de mauvaise solution. Mon opinion est que vous devriez commencer en utilisant des conditions comme <% si admin? %> bla bla <% fin%> ...

Ensuite, si votre vue d'administrateur diffère grandement de vos vues non-administrateur, supprimez les conditions et faites deux vues: my_view/my_view_admin.

2

Je n'aime vraiment pas tout double emploi, mais il est parfois la solution la plus simple.

Dans votre cas, je peux dire que

  • un administrateur a la possibilité de modifier les champs (en ligne?)
  • un administrateur voit plus de champs

En général, j'utilise la pierre précieuse on_the_spot pour l'édition en ligne, et je travaille ensuite avec un assistant comme ceci:

def on_the_spot_edit_if_allowed(object, field, options) 
    if current_user.admin? 
    on_the_spot_edit object, field, options 
    else 
    object.send(field) 
    end 
end 

Et dans ce cas, mon point de vue devient quelque chose comme

Title: <%= on_the_spot_edit_if_allowed book, title %> 
<%- if current_user.admin? %> 
    <!-- Awesome extra info for admins --> 
<% end %> 
Author: <%= book.author %> 
<%- if current_user.admin? %> 
    <!-- Awesome extra info for admins --> 
<% end %> 

Sauf disposition contraire (contraintes de conception/UI) impossible, je serais factoriser ce point de vue à ce qui suit:

Title: <%= on_the_spot_edit_if_allowed book, title %> 
Author: <%= book.author %> 
<%- if current_user.admin? %> 
    <%= render :partial => 'extra_admin_fields' 
<% end %> 

Hope this helps.

1

Gardez-le comme il est.

Vos doublons ne sont pas si gros.

La condition @current_user.admin? ne sera exécutée qu'une seule fois avec votre solution.

Si vous mettez @current_user.admin? dans une partie partagée, il sera exécuté pour chaque membre de cette collection. Pas cool.

Questions connexes