我正在为教师/学生类型的网站组建一个辅助项目,学生将与教师共享仪表板。教师和学生都可以上传文件并在仪表板中留下评论。
我坚持的部分是许可。对于学生,我已经为此方法设置了索引控制器
def index
@Homework = Homework.where(:user_id = current_user)
end
有了这个,我能让学生只看到他们所做的工作,但我对如何让老师看到每个学生的工作感到困惑?
连连呢?感谢
答案 0 :(得分:0)
不要使用大写的实例变量。例如:@Homework应该是@homework
查看gem CanCan。安装它(按照说明,你应该在应用程序控制器中放置一些东西),然后,输入你的能力文件:
class Ability
include CanCan::Ability
def initialize(user)
can :manage, Homework, user_id: user.id
end
end
然后在StudentController的顶部放置
load_and_authorize_resource
索引操作应如下所示:
@homework = @student.homework
现在,你没有发布你的整个控制器,所以这是我可以帮助的。
我相信你可能有更大的潜在问题。你的学生和老师在你的评论中读了很多作业。然后在您的示例中使用user_id。你可能会压倒你的学生和教师对家庭作业的所有权。你需要一个has_and_belongs_to_many关系,或者你需要在作业表上有一个student_id和teacher_id列
Cancan会自动生成许多实例变量,这些变量可以让它感觉像魔术一样。观看cancan上的免费railscast,就像制作视频的人一样写了CanCan库。
答案 1 :(得分:0)
如果您只需要在应用程序中支持单个类,这是一个简单的解决方案:
def index
if current_user.teacher?
@homeworks = Homework.all
else
@homeworks = Homework.where(user_id: current_user)
end
end
否则,您的家庭作业架构似乎没有正确设计。请参阅以下查询:
Homework.where(:user_id = <student_id>)
这适用于检索学生的作业,但它无法检索教师的学生作业。您可能需要一个class_id让教师看到每个学生的工作:
Homework.where(:class_id = <class_id>, :user_id = <student_id>)
班级有很多教师和有很多学生。此设计允许您支持多个类。
更多指导性问题:
对于复杂的用户权限,请使用CanCanCan:https://github.com/CanCanCommunity/cancancan