2009-12-25 7 views
0

Say, j'ai ce dans l'un des contrôleurs:comportement différent pour la même action de contrôleur dans Rails

def show 
    case current_user.role 
     when 'manager' 
     render :text => 'Manager view!' 
     when 'admin' 
     render :text => 'Admin view!' 
    end 
    end 

La chose est que, au lieu de « render », bien sûr, il y a un tas de code et Tout s'arrête très vite. En outre, j'ai d'autres actions dans mon contrôleur, qui doivent fonctionner différemment pour chacun des rôles d'utilisateur. Quelle est la meilleure façon de le refactoriser sans avoir à écrire des sortes de «si» et de «cas» dans le corps de l'action? J'aimerais avoir 2 fichiers - un pour chacun des rôles d'utilisateur; ou au moins deux actions différentes.

Répondre

1

Si les 2 variantes sont significativement différentes et doivent être appelées à partir du même contrôleur, vous pouvez utiliser un around_filter et envoyer le controller.action_name à l'une des 2 classes qui héritent de la même base.

si les 2 variantes ne sont pas si différents qu'il faut fork, ifs devrait bien se passer ...

pour le dispatching, il pourrait être juste une classe générique qui hérite d'une classe de base. vous pouvez avoir un commutateur dans votre filtre qui crée le bon objet basé sur le rôle, puis finalement envoyer ("# {action}") sur l'objet. je le ferais seulement si les variations sont si différentes qu'elles méritent 2 classes dérivées. Outre les classes génériques, vous pouvez également utiliser le Components avec la méthode render_component. dans la plupart des cas, les frais généraux d'envoi à un contrôleur de composants seraient plutôt négligeables. (C'est un peu comme un transfert côté serveur (Server.Transfer) dans .net.)

+0

Pourriez-vous spécifier la partie dispatching et l'héritage? À quoi ressemblerait-il dans ce cas? Je ne suis pas sûr. – snitko