我正在尝试在我的rails应用中为单表继承实现cancancan
gem。以下是STI的表格结构:
User model
Class User < ApplicationRecord
end
Teacher Model
Class Teacher < User
has_many :students, class_name: "User", foreign_key: "teacher_id"
end
Student Model
class Student < User
belongs_to :teacher, class_name: "User", foreign_key: "teacher_id"
end
以下是我的能力模型:
class Ability
include CanCan::Ability
def initialize(user)
if user.present?
if user.type == "Student"
can :manage, Student
end
if user.type == "Teacher"
can :manage, Teacher
end
if user.type == "Teacher"
can :read, Student, coach_id: user.id
end
end
end
end
如果user.type ==“学生” 可以:管理,学生 端
这用于防止教师访问学生的页面。
如果user.type ==“老师” 可以:管理,老师 端
这用于防止学生访问教师页面。
现在,根据我的理解,下面的代码应该可以访问属于特定教师的学生资料页面。
if user.type == "Teacher"
can :read, Student, coach_id: user.id
end
但是,当我尝试访问不属于登录教师帐户的学生的网址时,我仍然可以访问该网页。我想这个页面应该重定向到教师的个人资料页面。
以下是我为拒绝访问重定向所写的内容:
rescue_from CanCan::AccessDenied do | exception |
redirect_to user.type == "Teacher" ? teacher_profiles_path : stduent_profiles_path, alert: exception.message
end
我希望我能够解释整个场景。但是如果您需要一些额外的信息,请告诉我。
任何肝脏将不胜感激。提前致谢。 :)