2009-11-18 6 views
0

J'ai une application utilisée par plusieurs organisations et je veux vérifier que les utilisateurs d'un domaine (a.domain.com) ne peuvent pas éditer les utilisateurs d'un autre domaine (b.domain.com). Ma question est où mettre la logique, dans un filtre avant ou dans la vue?Rails - Trop de logique dans les vues?

Vue:

<% if @user.websites.detect {|website| website.url == request.host} %> 
    render :partial => 'form' 
<% else %> 
    render :partial => 'no_access' 
<% end %> 

Ou, dans le contrôleur:

before_filter :verify_editable_user, :only => ['edit', 'update', 'delete'] 
protected 
def verify_editable_user 
    @user = User.find(params[:id], :include => 'websites') 
    unless @user.websites.detect {|website| website.url == request.host} 
    render 'no_access' 
    end 
end 

Dans ce scénario, la première version se sent me plus propre. Cependant, la seconde semble plus le long du scénario MVC. Qu'est-ce que tu penses? Suis-je loin de la base? Merci d'avance.

Répondre

0

Je recommande d'utiliser la gemme de verrouillage pour l'autorisation. (Voir http://stonean.com/)

La seconde est en fait beaucoup plus propre.

0

Un couple d'autres gemmes d'autorisation à vérifier serait CanCan et acl9.

0

Vous ne devez pas placer de logique dans vos vues. Avoir la logique dans les contrôleurs et non dans les vues rendra réellement vos essais plus faciles ...

0

Je recommanderais before_filter et acl9. Également utiliser presenters pour obtenir le code hors de vos vues et dans un objet ruby ​​testable