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
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
我在尝试使用 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
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