2016-11-25 64 views
0

我正在计划一个具有用户模型+不同用户子类型(例如学生,教师......)的应用程序,并为每个子类型分配一个专用模型。 我打算直接在rails中对用户级别进行身份验证,没有具体的宝石。针对不同的用户类型显示视图

我的问题是有关处理用户查看视图文件:

  • 我应该直接显示用户在用户 控制器的显示文件(加入了很多的条件,我的视图文件,根据的 用户子类型)还是
  • 我应该使用用户显示控制器操作作为网关 重定向专用于每个子类型的控制器......然后使用更直接的显示视图 。要做到这一点

回答

1

你的看法应该几乎没有这种逻辑。这将打破MVC并降低应用程序的可维护性。你应该至少留给控制器,是这样的:

def show 
    render proper_view_by_user 
end 

private 
def proper_view_by_user 
    # Define this user_type on your own 
    # on devise you'd do something like current_user.class_name 
    switch user_type 
    when 'Admin' then 
     'admins_show' # template found in your views folder 
    when 'NormalUser' then 
     'normal_show' 
    else 
     'normal_show' 
    end 

end 

除非这是一个学习的项目,确实可以考虑使用设计,而不是滚动您自己的身份验证系统。阅读this

+0

谢谢,这似乎是正确的,不要过多查看文件太多。如果我没有弄错,你的代码似乎将我重定向到专用的子类型控制器显示操作。我对所有滚动的东西仍然有点困惑:滚动只是关于自动化,还是它适用于整个网站结构和操作。我会阅读你提到的文章,并尝试了解一些。 – Maxence

+0

我的意思是认证部分主要是因为它很敏感,很难覆盖所有的战线。设计宝石有很多功能,并且具有合理的安全性,据我所知,它也有很多关于SO的文档和答案来指导你。可以宝石也有一些更多的功能,可以帮助您将应用程序的某些部分授权给不同的用户,但您可以自行编写它们。给它一个想法! – mlabarca

+0

我并不熟悉授权概念,但它会来。正如我以为我可以在我的控制器内做到这一点,只要罚款和歧视取决于authicated用户...最后一个问题,但:你认为我应该保持一个用户模型+子模型?或者,我应该摆脱用户模式并向子模型添加验证细节(电子邮件,密码..)(然后不再是子模型,但更多不同类型的用户)。 – Maxence

1

的一种方法是使用泛音,然后渲染具有相同的名称作为用户亚型部分:

<%# users/show.html.erb %> 
<%= render partial: user.user_subtype %> 

<%# users/_admin.html.erb %> 
<h1>Admin</h1> 

<%# users/_student.html.erb %> 
<h1>Student</h1> 

<%# users/_teacher.html.erb %> 
<h1>Teacher</h1> 

顺便说一句,如果你处理的访问级别我强烈建议使用Pundit宝石。它会为你节省很多头痛。

+0

谢谢。我猜这些部分确实会创建一个更干净的视图文件。另一个答案表明我不应该在视图文件中添加太多的逻辑。我仍然有点困惑,但需要阅读一些关于设计我猜 – Maxence

+0

你可能不会在Devise文档中找到很多关于这方面的内容,因为Devise主要关心认证。你正在做的是*授权*,它关心用户在登录后可以做些什么。正如我所提到的,请查看Pundit gem - 这对于从视图中删除授权逻辑非常有帮助。 – mysmallidea

相关问题