CanCan — Как правильно установить способность вложенных ресурсов

#ruby-on-rails #ruby-on-rails-3 #cancan

#ruby-on-rails #ruby-on-rails-3 #cancan

Вопрос:

В моем приложении у меня есть следующие модели:

 Users
Groups
Permissions (user_id, group_id, role_id)
  

Где role_id 1: администратор, 2: участник

Я хочу убедиться, что я правильно понимаю CanCan. В файле ability.rb я хочу, чтобы только администраторы группы (permission.role_id == 1) могли обновлять / уничтожать / создавать новые разрешения группы.

разрешение.role_id == 2, участники, должны просто иметь возможность читать группу и разрешения группы. За исключением возможности уничтожить их групповое разрешение.

Вот мой файл CanCan ability.rb:

 class Ability
    include CanCan::Ability

    def initialize(current_user, groupid_viewing)

        current_user ||= User.new #Guest user (not signed in)

        if groupid_viewing amp;amp; current_user.try(:role, groupid_viewing) == 'Admin'
            can :manage, Group

            can [:create, :update], Permission do |permission|
        current_user.try(:role, groupid_viewing) == 'Admin'
            end





class GroupsController < ApplicationController
....
    def current_ability
          @current_ability ||= Ability.new(current_user, params[:group_id] amp;amp; params[:group_id].to_i)
    end


class ApplicationController < ActionController::Base
    def current_ability
        @current_ability ||= Ability.new(current_user, nil) #(user, group)
    end
  

Ответ №1:

Вам также необходимо указать способности для role_id:2 .

 if groupid_viewing amp;amp; current_user.try(:role, groupid_viewing) == 'Member'
   can :read, Group
   can :destroy, Permission do |permission|
      current_user.try(:role, groupid_viewing) == 'Member'
   end
  

Кроме того, нет необходимости создавать current_ability так, как вы делаете.
Это должен быть обратный вызов after_create, который должен назначать способности при создании участника или администратора.