CanCan 授权发布索引动作

CanCan authorization issue index action

我在尝试使用 cancan 授权时遇到问题。我的用户每个用户都有一个角色,因此我按照 the cancan wiki.

中的建议添加了 user.role 列

我还有一个幼儿园的索引视图和另一个 children 的索引视图。

我想要实现的是只允许具有角色 kindergarden 或 parent(对于 children)的相应用户访问索引视图。

当我现在在幼儿园控制器中授权幼儿园时,任何人都不允许访问索引视图,尽管我在我的能力模型中定义了它。

非常感谢您的帮助。我不知道我错过了什么...

能力模型:

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

你将你的能力定义为方块并且需要有实例。在索引操作中,您只有 Active Record 范围,而不是实际实例。

顺便说一下,您在控制器代码中有错别字:

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

See the docs:

The block is only evaluated when an actual instance object is present. It is not evaluated when checking permissions on the class (such as in the index action).

在这种情况下,您可以使用 hashes of conditions

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