2010-10-22 17 views
7

Ho una risorsa Progetti che è annidata nella risorsa Utenti.Rails cancan che autorizza le risorse nidificate

mio Cancan classe Ability è:

class Ability 
    include CanCan::Ability 
    def initialize(user) 
    #everyone 
    can :read, Project 

    if user.blank? 
     # guest user 
     ... 
    else 
     #every signed in user 

     case user.role 
     when User::ROLES[:admin] 
      #only admin role user 
      can :manage, :all 

     when User::ROLES[:member] 
      #only member role user 
      can :update, User, :id => user.id 
      can [:create, :update, :destroy], Project, :user_id => user.id 
     else 

     end 
    end 
    end 
end 

e il controller Progetti:

class ProjectsController < ApplicationController 
    load_and_authorize_resource :user 
    load_and_authorize_resource :projects, :through => :user, :shallow => true 
    ... 
end 

ho alcune domande:

è possibile negare: Leggi i commenti e lasciare: leggere Progetto, in modo che tutti potessero accedere/utenti/10/progetti, ma non/utenti/10 o/utenti?

Come posso negare l'accesso utente: nuova azione con altro user_id? Ad esempio, se aggiungo

#everyone 
can :read, User 
can :read, Project 

questo codice permette all'utente con id 42 per accesso/utente/41/progetti/nuovo.

risposta

10

risolto facendo:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    #everyone 
    can :read, Project 

    can :read, User # required to access nested resources 
    cannot :index, User 
    cannot :show, User 

    if user.blank? 
     # guest user 
     ... 
    else 
     #every signed in user 

     case user.role 
     when User::ROLES[:admin] 
      #only admin role user 
      can :manage, :all 

     when User::ROLES[:member] 
      #only member role user 
      can :update, User, :id => user.id 
      can :manage, Project, :user => { :id => user.id } 
     else 

     end 
    end 
    end 
end 
Problemi correlati