2

我在尝试使用 cancan 授权时遇到问题。我有每个用户一个角色的用户,所以我按照cancan wiki 中的建议添加了 user.role 列。

我也有幼儿园的索引视图和儿童的另一个索引视图。

我想要实现的是只允许具有角色幼儿园或父母(儿童)的相应用户访问索引视图。

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

帮助将不胜感激。我不知道我错过了什么......

能力模型:

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
4

1 回答 1

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
于 2018-03-12T11:48:56.377 回答