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ます。これにより、新しいClassroomレコードがschool_idで初期化され、インストラクターがレコードを管理できるようになります。ただし、私の教室のコントローラーではload_and_authorize_resource、学校と教室の関係が確立され、CanCan承認例外がスローされる前に、インストラクターを承認するように呼び出します。

これを回避する方法はありますか?

4

1 に答える 1

3

CanCan は学校との関連付けが構築される前に能力を確認している可能性があります。create および manage パーミッションを明示的に分割できます。

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

次に、検証で教室がインストラクターの学校に属していることを確認します。

于 2012-11-19T22:34:42.807 に答える