2010-10-22 4 views
7

У меня есть ресурс Projects, который вложен в ресурс Пользователей.Rails cancan разрешает вложенные ресурсы

Мой Канкан класс способность:

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 

И контроллер Проекты:

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

У меня есть несколько вопросов:

Можно ли отрицать: чтение пользователя и позволяет: прочитать Project, чтобы каждый мог получить доступ/users/10/projects, но не/users/10 или/users?

Как я могу запретить пользователю доступ: новое действие с другим user_id? Например, если я добавлю

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

Этот код позволяет пользователю с id 42 обращаться к пользователю/41/projects/new.

ответ

10

решаемые его, выполнив:

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 
Смежные вопросы