1

cancanと一緒にRailsのネストされたリソースを操作しようとしています。私は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自分の交友関係や友達の交友関係を変更することはできません。

何故ですか?

4

1 に答える 1