2012-11-19 145 views
2

我正在建立一个学校系统,教员可以在各自学校范围内管理教室。Rails 3 CanCan授权范围所有权

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

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

有没有办法解决这个问题?

回答

3

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

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

然后检查教室是否属于教师的学校。

+0

当然,我想我对我的授权过于依赖cancan。有一点需要注意的是,语法'can:manage,Classroom,instructor == user'在cancan 1.6.8上看起来不太可行,我得到了未定义的局部变量或方法指导。然而,在教室里面的工作可以阻止。 – Noz

+0

该语法可能只适用于属性,不适用于关联 - 请尝试编辑后的版本。 – Thilo

+0

很好的尝试,但仍然没有骰子。尽管如此,稍微详细一点并不是一个大问题。 – Noz