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
自分の交友関係や友達の交友関係を変更することはできません。
何故ですか?