CanCan - 模型领域的测试能力?

时间:2011-08-24 21:40:16

标签: ruby-on-rails ruby-on-rails-3 cancan

您好我有以下

型号:

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)

1 个答案:

答案 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)