使用嵌套资源和Cancan

时间:2013-04-22 07:37:20

标签: ruby-on-rails cancan

我正在尝试使用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他自己的​​友谊或他朋友的友谊。

为什么?

1 个答案:

答案 0 :(得分:0)

您为管理员提供了“管理”“所有”权限,因此他可以看到所有的友情。

但是你没有给非管理犬的友谊提供任何权限。

跳过索引操作的“友谊”授权。

load_and_authorize_resource :friendship, :through => :dog, :except => [:index]

在友谊控制器中,将仅基于狗模型授权索引操作,并且将基于狗以及友谊模型授权所有其他操作。