我在系统中有多个用户类型,通常根据他们是否已登录以及current_user.user_type是什么来向每个用户显示存储信息的不同视图和模板。因此,我有很多这样的事情:
#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项目,我很确定这是一个糟糕的设计。什么是简单干净的方式以更好的方式做到这一点?
答案 0 :(得分:2)
如果您拥有很多这样的代码,那么您的控制器实际上有多种用途的代码味道。假设您的控制器类似于InfoController,它是某个Info模型的REST视图,请问自己:
您的操作的核心部分,数据或访问的用户是什么 它
您是否根据具体情况做出决定? 请求行动? (就像保存一样, 删除等)
可以在这些决定中采取这些决定 信息模型,而不是控制器?
对我而言,您似乎应该为每个模型创建不同的控制器,并且每个操作只进行一次重定向。在您的视图中,您可以使用polymorphic_paths之类的内容链接到您的控制器。
如果您决定不这样做,我只需将该代码放在case
语句中,而不是if
。
答案 1 :(得分:0)
还可以使用此处显示的约束:User-centric Routing in Rails 3
root :to => "companies#home", :constraints => UserTypeConstraint.new("Company")
如此处所示的范围路线:Use lambdas for Rails 3 Route Constraints
scope :constraints => lambda{|req| !req.session[:company_user_id].blank? } do
# all company routes
end
答案 2 :(得分:-3)
当用户在您的应用程序中登录时,您必须有一些代码才能将它们重定向到某个位置 这是您想要放置代码的地方。 你可能想用:
redirect_to companies_path