您好我有以下
型号:
User (id)
Room (user_id, title)
RoomMember (user_id, room_id, admin)
给定: @ USER1 @用户2 @用户3 爱得屋
@ user1创建了房间,是一个房间管理员。 @ user1应该是@ user2一个RoomUser.admin。 @ user3谁不是管理员不应该使@ user2成为RoomUser.admin。这就是我想要编写规范,但无法弄清楚如何使用CanCan进行测试。以下是我到目前为止的情况:
room_member是会议室的@ user2 RoomMember记录
ability.should be_able_to(:update, room_member.admin)
关于我如何编写针对此CanCan的规范的任何建议?
由于
以我的能力更新
在规格中:
#Ability (user, room, room_password)
room_member = @room_for_user_1.room_members.create(:user_id => @user_2.id)
ability = Ability.new(@user_1, @room_for_user_1, nil)
答案 0 :(得分:1)
我不是CanCan的专家,但我认为你不能以你的方式来定义这种能力。就我在文档和示例中看到的而言,操作仅在记录上定义,而不是在记录属性上定义。
如果要定义不能完全控制记录的功能,则需要定义自定义操作。
class Ability
include CanCan::Ability
def initialize (user = nil)
user ||= User.new
can :set_admin, [ Room ] { |room| user.room_members.any?{ |rm| rm.room == room && rm.admin? } }
end
end
或者,如果您只希望房间所有者控制房间管理员,那么这将是can :set_admin, [ Room ] { |room| room.user == user }
。
然后可以直接测试:ability.should be_able_to(:set_admin, room)
或者,取决于测试中的变量:ability.should be_able_to(:set_admin, room_member.room)