2016-11-25 96 views
0

我正在計劃一個具有用戶模型+不同用戶子類型(例如學生,教師......)的應用程序,併爲每個子類型分配一個專用模型。 我打算直接在rails中對用戶級別進行身份驗證,沒有具體的寶石。針對不同的用戶類型顯示視圖

我的問題是有關處理用戶查看視圖文件:

  • 我應該直接顯示用戶在用戶 控制器的顯示文件(加入了很多的條件,我的視圖文件,根據的 用戶子類型)還是
  • 我應該使用用戶顯示控制器操作作爲網關 重定向專用於每個子類型的控制器......然後使用更直接的顯示視圖 。要做到這一點

回答

1

你的看法應該幾乎沒有這種邏輯。這將打破MVC並降低應用程序的可維護性。你應該至少留給控制器,是這樣的:

def show 
    render proper_view_by_user 
end 

private 
def proper_view_by_user 
    # Define this user_type on your own 
    # on devise you'd do something like current_user.class_name 
    switch user_type 
    when 'Admin' then 
     'admins_show' # template found in your views folder 
    when 'NormalUser' then 
     'normal_show' 
    else 
     'normal_show' 
    end 

end 

除非這是一個學習的項目,確實可以考慮使用設計,而不是滾動您自己的身份驗證系統。閱讀this

+0

謝謝,這似乎是正確的,不要過多查看文件太多。如果我沒有弄錯,你的代碼似乎將我重定向到專用的子類型控制器顯示操作。我對所有滾動的東西仍然有點困惑:滾動只是關於自動化,還是它適用於整個網站結構和操作。我會閱讀你提到的文章,並嘗試瞭解一些。 – Maxence

+0

我的意思是認證部分主要是因爲它很敏感,很難覆蓋所有的戰線。設計寶石有很多功能,並且具有合理的安全性,據我所知,它也有很多關於SO的文檔和答案來指導你。可以寶石也有一些更多的功能,可以幫助您將應用程序的某些部分授權給不同的用戶,但您可以自行編寫它們。給它一個想法! – mlabarca

+0

我並不熟悉授權概念,但它會來。正如我以爲我可以在我的控制器內做到這一點,只要罰款和歧視取決於authicated用戶...最後一個問題,但:你認爲我應該保持一個用戶模型+子模型?或者,我應該擺脫用戶模式並向子模型添加驗證細節(電子郵件,密碼..)(然後不再是子模型,但更多不同類型的用戶)。 – Maxence

1

的一種方法是使用泛音,然後渲染具有相同的名稱作爲用戶亞型部分:

<%# users/show.html.erb %> 
<%= render partial: user.user_subtype %> 

<%# users/_admin.html.erb %> 
<h1>Admin</h1> 

<%# users/_student.html.erb %> 
<h1>Student</h1> 

<%# users/_teacher.html.erb %> 
<h1>Teacher</h1> 

順便說一句,如果你處理的訪問級別我強烈建議使用Pundit寶石。它會爲你節省很多頭痛。

+0

謝謝。我猜這些部分確實會創建一個更乾淨的視圖文件。另一個答案表明我不應該在視圖文件中添加太多的邏輯。我仍然有點困惑,但需要閱讀一些關於設計我猜 – Maxence

+0

你可能不會在Devise文檔中找到很多關於這方面的內容,因爲Devise主要關心認證。你正在做的是*授權*,它關心用戶在登錄後可以做些什麼。正如我所提到的,請查看Pundit gem - 這對於從視圖中刪除授權邏輯非常有幫助。 – mysmallidea

相關問題