2011-01-26 4 views
1

Je fais un test sur un modèle user pour déterminer s'il/elle a un ou plusieurs task_list, si elle a plus d'une liste de tâches, alors elle est autorisée à le supprimer, sinon une exception est levée. J'ai fondamentalement une méthode appelée delete_list dans le modèle d'utilisateur pour permettre des suppressions de main courtes comme user1.delete_list(list1)Autorisation Rails? check in Model vs controller

Je discute s'il faut mettre le contrôle dans CanCan où il s'appliquerait comme filtre avant sur le contrôleur ou si avoir dans le modèle utilisateur aussi. Quelle est la pratique recommandée?

Répondre

1

Je pense qu'une bonne approche DRY serait de créer une méthode dans votre modèle qui teste si une suppression est autorisée. Ensuite, utilisez cette méthode depuis votre contrôleur ou depuis ability.rb. IMHO Je pense que d'avoir une permission compliquée/une logique métier découplée de CanCan est préférable quand il y a une possibilité que vous changiez de système d'autorisation différent dans le futur.

Dans votre modèle:

def can_destroy_list(list) 
    ... Do check here .... 
end 

Dans ability.rb

can :destroy, List do |list| 
    user.can_destroy_list(list) 
end 

Votre contrôleur et les vues peuvent utiliser aussi can_destroy_list directement sur l'instance de modèle si nessary ou de l'utilisation: si can? :destroy, @list