2010-10-22 37 views
7

Tôi có tài nguyên Dự án được lồng trong tài nguyên Người dùng.Rails cancan cho phép tài nguyên lồng nhau

My Cancan lớp Khả năng là:

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 

Và điều khiển dự án:

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

Tôi có vài câu hỏi:

Có thể từ chối: đọc người dùng và cho phép: đọc Dự án, để mọi người có thể truy cập/người dùng/10/dự án, nhưng không phải/người dùng/10 hoặc/người dùng?

Làm cách nào để từ chối truy cập của người dùng: hành động mới với user_id khác? Ví dụ: nếu tôi thêm

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

mã này cho phép người dùng có id 42 truy cập/người dùng/41/dự án/mới.

Trả lời

10

Giải quyết bằng cách thực hiện:

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 
Các vấn đề liên quan