在Rails中管理条件redirect_to

时间:2010-06-24 23:41:17

标签: ruby-on-rails redirect controller if-statement

我在系统中有多个用户类型,通常根据他们是否已登录以及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项目,我很确定这是一个糟糕的设计。什么是简单干净的方式以更好的方式做到这一点?

3 个答案:

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