2014-01-24 79 views
1

我有一个区分为6个角色的用户模型,并且我定义了不同的变量并将它们引导到不同的视图文件(类似的格式,但不同的信息表),但是在同一个控制器操作中,因为它们都具有类似的页面“概述”,“配置文件”,“消息”等。多个用户角色的路由

现在控制器非常混乱,并且具有多个if/else语句。我相信我应该改变路线,以便每个用户都有自己的控制器,从而消除当前侵入控制器的if/else monstrosity。

def index 
    if current_user.admin? 
    .... 
    end 
    if current_user.moderator? 
    .... 
    end 
end 

问:如何进行路由,使得URL将被 www.website.com/1/schedule,其中1 = current_user.id,而具有不同的控制器呈现不同的视图文件?

我想做一个AdminController和一个ModeratorController来处理这个,但不知道如何做路由,或者如果确实这是做到这一点的最好方法。提前感谢您的建议!

+1

可能重复:http://stackoverflow.com/questions/11053175/devise-role-based-routing希望它能帮助你。 – Pavan

回答

0

我认为你做错了,如果你有不同的角色类似的页面,那么我认为你正在访问相同的模型来处理不同的角色。

如果是这种情况,那么你应该使用像Cancan一样的Ruby(Ruby on Rails授权库)。

+0

我不是授权操作。我将完全转到不同的页面。管理员将呈现“admin_overview.html.slim” –

0

为了解决您的第二个问题,我认为这不是最好的方法。试试这个 - 将您的逻辑从多个控制器移开,并将逻辑保存在ApplicationController中。我认为你不应该将不同的角色分开给控制器。相反,看看你的用户模型,并放入一个方法来检查不同用户的权限级别。您可以在用户模型中创建可以在控制器中调用的方法,以查看是否允许用户访问该操作。我们会在这里推荐before_action

如果您决定保留多个控制器,我建议像授权一样的宝石。使它更容易跟踪不同的权限,即使跨越不同的控制器 - 我认为路由也是如此:https://github.com/nathanl/authority

+0

我目前在应用程序控制器中有这些查询方法,这就是我如何分别在索引方法中测试用户角色。我只是想知道if-else语句是否有解决更好结构的好方法。 –