簡體   English   中英

在Rails中管理條件redirect_to

[英]Managing conditional redirect_to in Rails

我在系統中有多種用戶類型,通常根據他們是否登錄以及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項目,我很確定這是糟糕的設計。 有什么簡單,干凈的方法可以更好地做到這一點?

如果您有很多這樣的代碼,則說明您的控制器確實有多種用途,這是一種代碼味道。 假設您的控制器類似於InfoController,它是某些Info模型的REST視圖,請問自己:

  • 您的操作,數據或訪問它的用戶的中心部分是什么?

  • 您是否根據誰要求采取行動來做出決定? (如保存,刪除等)

  • 可以在信息模型中而不是在控制器中做出這些決定嗎?

在我看來,您應該為每個模型創建不同的控制器,並且每個動作僅進行一次重定向。 在您的視圖中,可以使用諸如polymorphic_paths之類的內容鏈接到您的控制器。

如果您決定不執行此操作,則將代碼放在case語句中,而不是if

也可以使用約束,如下所示: Rails 3中的以用戶為中心的路由

root :to => "companies#home", :constraints => UserTypeConstraint.new("Company")

或范圍內的路線,如下所示: 將lambdas用於Rails 3路線約束

scope :constraints => lambda{|req| !req.session[:company_user_id].blank? } do
  # all company routes
end

當用戶在應用程序中單擊登錄時,您必須具有一些代碼才能將其重定向到某處。
這是您要放置代碼的地方。 並且您可能想使用:

redirect_to companies_path

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM