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