2010-06-24 33 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