我在尝试使用cancan授权时遇到问题。我的用户每个用户都有一个角色,因此我按照the cancan wiki中的建议添加了user.role列。
我还有一个关于幼儿园的索引视图和另一个儿童索引视图。
我想要实现的目的是只允许使用角色kindergarden或parent(对于孩子)访问相应用户的索引视图。
当我现在在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
Kindergardens控制器:
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
答案 0 :(得分:1)
您将自己的能力定义为块,并且需要拥有实例。在索引操作中,您只有Active Record范围,而不是实际实例。
顺便说一句,您在控制器代码中输入错字:
def index
@kigas = Kiga.all
authorize! :index, @kigas # was @kiga that is nil probably
end
仅在存在实际实例对象时评估该块。在检查类的权限时(例如在索引操作中),不会对其进行评估。
在这种情况下,您可以使用hashes of conditions
can [:update, :destroy], Kiga, user_id: user.id