Rails 3 CanCan授权Scoped Ownership

时间:2012-11-19 22:23:30

标签: ruby-on-rails-3 devise cancan before-filter

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

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

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授权例外。

有什么方法吗?

1 个答案:

答案 0 :(得分:3)

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

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

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