CanCan авторизация проблема с индексом действий

У меня возникла проблема при попытке использовать авторизацию cancan. У меня есть пользователи с одной ролью на каждого пользователя, поэтому я добавил столбец user.role, как это предлагается в вики cancan.

У меня также есть индексное представление для детских садов и другое индексное представление для детей.

Я пытаюсь добиться того, чтобы разрешить доступ к индексным представлениям только соответствующим пользователям с ролью детский сад или родитель (для детей).

Когда я сейчас авторизую Kindergardens в контроллере kindergardens, никому не позволено получить доступ к представлению индекса, хотя я определил его в своей модели способностей.

Помощь будет высоко ценится. Я понятия не имею, что мне не хватает...

Способность модели:

class Ability
include CanCan::Ability

def initialize(user)
[...]
elsif user.role == 'kindergarden'
   can [:update, :destroy], Kiga do |kiga|
     kiga.user_id == user.id
   end
   can :read, Kiga do |kiga|
     kiga.user_id == user.id
   end
   can :index, Kiga

   can :create, Kiga
else

end

Контроллер детских садов:

class KigasController < ApplicationController
before_action :set_kiga, only: [:show, :edit, :update, :destroy]

# GET /kigas
# GET /kigas.json
def index
  @kigas = Kiga.all
  authorize! :index, @kiga
end

2 ответа

Решение

Вы определяете свои способности как блоки, которые должны иметь экземпляры. В действиях с индексами у вас есть только области Active Record, а не реальные экземпляры.

Кстати, у вас есть опечатка в коде контроллера:

def index
  @kigas = Kiga.all
  authorize! :index, @kigas # was @kiga that is nil probably
end

Смотрите документы:

Блок оценивается только при наличии фактического объекта экземпляра. Он не оценивается при проверке прав доступа к классу (например, в действии index).

В этом случае вы можете использовать хеши условий

 can [:update, :destroy], Kiga, user_id: user.id

Есть решение

      def index
  @kigas = Kiga.all
  authorize! :index, Kinga
end
Другие вопросы по тегам