[英]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.