2010-06-24 108 views
0

我在系统中有多个用户类型,通常根据用户是否登录以及current_user.user_type是什么来显示每个用户不同的视图和存储信息的模板。因此,我有很多这样的:在Rails中管理条件重定向

#controller 
@project = Project.find(params[:id]) 
if current_user.user_type == "Company" 
    redirect_to :controller => "companies", :action => "home" 
elsif current_user.user_type == "Contractor" 
    @contractor = Contractor.find(current_user.user_type_id) 
    redirect_to :controller => "contractors", :action => "home" 
elsif current_user.user_type == "Customer" 
    redirect_to :controller => "companies", :action => "list" 
end 

这是我的第一个Rails项目,我很肯定这是糟糕的设计。以更好的方式做这件事的简单干净的方法是什么?

回答

2

如果您有任何的代码很多这样,是你的控制器是真正服务于多个目的的代码味道。假设你的控制器类似InfoController,这对某些信息模型REST视图,问自己:

  • 什么是你的行动的中央部分,谁访问 它的数据或用户?

  • 您是否根据谁请求采取了哪些操作? (像保存, 删除等)

  • 这些决定可以在 信息模型,而不是在控制器?

对我来说,好像你应该为每个模型创建不同的控制器,并且每个动作只做一个重定向。在你的观点中,你可以使用诸如polymorphic_paths之类的东西来连接你的控制器。

如果您决定不这样做,我只是将该代码放在case声明中,而不是if

+0

藏袍,在我看来,我应该只是做case语句。例如,我有些地方会以用户身份登录,但根据用户的user_type,他们会被重定向到其他控制器的主页。如果这只是一个重定向问题(而不是一个数据决策),那么一个案例陈述就足够了。这看起来合理吗? – sscirrus 2010-06-29 06:17:12

-3

当用户在应用程序中击中登录名时,必须有一些代码将它们重定向到某处。
这是你想要把你的代码。 ,你可能想使用:

redirect_to companies_path