我正在建立一个学校系统,教师可以在各自学校范围内管理教室。
我有以下能力设置来匹配:
class Ability
include CanCan::Ability
#define the user ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.has_role? :instructor
can :manage, Classroom do |classroom|
classroom.new_record? && classroom.school_id == user.school_id || classroom.instructor == user
end
end
end
end
理论上,这应该使教师能够管理新的记录,只要教师和新教室都属于同一所学校,就不会与教师设置有关系。
在我的课堂上,我从家长学校建立了教室,以适应这个@classroom = @school.classrooms.build
。这将使用school_id初始化新的课堂记录,使教师能够管理记录。然而,在我的课堂控制器中,我打电话给load_and_authorize_resource
,在学校建立课堂关系之前授权教师,并抛出CanCan授权例外。
有什么方法吗?
答案 0 :(得分:3)
CanCan可能在与学校建立联系之前检查能力。您可以明确地分解创建和管理权限:
can :create, Classroom
can :manage, Classroom, instructor_id: user.id
然后在验证中检查教室是否属于教师学校。