我正在尝试使用Rails嵌套资源与cancan一起使用。我有Dog
模型和Friendship
模型。
class Dog < ActiveRecord::Base
has_many :friendships
has_many :friends, :through => :friendships
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
has_many :inverse_friends, :through => :inverse_friendships, :source => :dog
end
class Friendship < ActiveRecord::Base
belongs_to :dog
belongs_to :friend, :class_name => "Dog"
end
在FriendshipsController
内我有以下定义:
load_and_authorize_resource :dog
load_and_authorize_resource :friendship, :through => :dog
在能力方面,如果它是同一条狗,或者如果它们是朋友,或者如果这是管理员狗,可以:read Dog
......
can [:read, :show], Dog do |d|
d.id == dog.id or d.friend_of? dog.id
end
更多能力类:
class Ability
include CanCan::Ability
def initialize(dog)
if dog.admin?
can :manage, :all
else
if dog.guest?
# anyone can register
can [:create], :dog
else
can [:show, :update, ...], Dog, :id => dog.id
can [:read, :show], Dog do |d|
((d.id == dog.id) or (dog.friend_of? d))
end
end
end
end
end
管理员可以:index
每只狗的友谊,但狗不能:index
他自己的友谊或他朋友的友谊。
为什么?
答案 0 :(得分:0)
您为管理员提供了“管理”“所有”权限,因此他可以看到所有的友情。
但是你没有给非管理犬的友谊提供任何权限。
跳过索引操作的“友谊”授权。
load_and_authorize_resource :friendship, :through => :dog, :except => [:index]
在友谊控制器中,将仅基于狗模型授权索引操作,并且将基于狗以及友谊模型授权所有其他操作。