2

我正在建立一个学校系统,教师可以在其中管理各自学校范围内的教室。

我有以下匹配的能力设置:

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 授权异常。

有没有办法解决?

4

1 回答 1

3

CanCan 可能在与学校建立联系之前检查能力。您可以明确打破创建和管理权限:

can :create, Classroom
can :manage, Classroom, instructor_id: user.id

然后在验证中检查教室是否属于教师的学校。

于 2012-11-19T22:34:42.807 回答