8

ユーザーリソースにネストされたプロジェクトリソースがあります。

私のCancanAbilityクラスは次のとおりです。

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

いくつか質問があります:

:read Userを拒否し、:read Projectを許可して、全員が/ users / 10 / projectsにアクセスできるようにすることはできますが、/ users /10や/usersにはアクセスできませんか?

他のuser_idで:newアクションにアクセスするユーザーを拒否するにはどうすればよいですか?たとえば、私が追加した場合

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

このコードにより、ID42のユーザーは/user / 41 / projects/newにアクセスできます。

4

1 に答える 1

11

次のようにして解決しました。

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
于 2010-10-22T08:55:12.193 に答える