在rails中的“仪表板”区域内设置自定义权限

时间:2015-03-05 20:14:29

标签: ruby-on-rails ruby ruby-on-rails-4

我正在为教师/学生类型的网站组建一个辅助项目,学生将与教师共享仪表板。教师和学生都可以上传文件并在仪表板中留下评论。

我坚持的部分是许可。对于学生,我已经为此方法设置了索引控制器

def index
@Homework = Homework.where(:user_id = current_user) 
end

有了这个,我能让学生只看到他们所做的工作,但我对如何让老师看到每个学生的工作感到困惑?

连连呢?感谢

2 个答案:

答案 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>) 

班级有很多教师和有很多学生。此设计允许您支持多个类。

更多指导性问题:

  • 教师/学生是否都保持相同的用户模式?
  • 您如何区分当前用户模型中的教师/学生?
  • 用户中某处有“user_type”列吗?
  • 如果current_user属于“teacher”user_type?
  • 会怎样?

对于复杂的用户权限,请使用CanCanCan:https://github.com/CanCanCommunity/cancancan