2011-08-24 92 views
0

您好,我有以下CanCan - 测试模型领域的能力?

型号:

User (id) 
Room (user_id, title) 
RoomMember (user_id, room_id, admin) 

考虑: @ USER1 @ user2的 @用户3 爱得屋

@ USER1创建房间,一个房间管理员。 @ user1应该是make @ user2一个RoomUser.admin。 @ user3不是管理员,不应该使@ user2成为RoomUser.admin。这就是我想写的规范,但无法弄清楚如何使用CanCan进行测试。以下是我迄今为止:

room_member是客房

ability.should be_able_to(:update, room_member.admin) 

如何,我可以写一个规范的该W惨惨的任何意见@ user2的RoomMember记录?

感谢

我的能力

在规格更新时间:

#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) 
+1

你是问有关测试的能力,或者是你的问题真的那么你不知道如何定义这种能力? –

+0

我知道如何定义我拥有的能力。我不知道该怎么做的是用对象中的一个字段来测试这个能力。我只希望其他RoomMember.admins能够创建另一个RoomMe.admin – AnApprentice

+1

请为此任务显示您的能力定义。 –

回答

1

我不是惨惨的专家,但我不认为你可以定义的能力在你尝试的方式。据我在文档和示例中看到的,操作只在记录中定义,而不是在记录属性上定义。

当你想定义一个不能完全控制记录的能力时,你需要定义一个自定义动作。

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)

+0

谢谢,我认为你是对的。 – AnApprentice