2011-10-03 65 views
0

我正在一個網站,允許用戶登錄。所有用戶都有一個帳戶,一個帳戶可以有很多訂單。用戶可能是客戶,工作人員或經理。客戶從來不是工人,也不是經理。經理也是一名工人。我想根據用戶的登錄類型提供其他頁面/導航選項部分。布爾與主場迎戰國旗

當前我正在使用一組布爾值來標記用戶爲特定類型,測試該值並運行通過一些if/elsif塊來生成用戶看到的頁面。

class User 
    include DataMapper::Resource 
    # ... 
    # various properties 
    # ... 
    property :client, Boolean 
    property :worker, Boolean 
    property :manager, Boolean 
end 

然後我使用一個before過濾器來測試用戶類型並將結果設置爲變量。

before do 
    @user = session[:user] 
    if @user.client? 
    @ura = 'client' 
    elsif @user.worker? 
    @ura = 'worker' 
    elseif @user.manager? 
    @ura = 'manager' 
    end 
end 

然後在我的意見中,我有@ura玩弄。在我看來,這已經會給管理者帶來問題,因爲@ura必須是工作人員&經理。我可以在我的意見中使用一些或者,但我認爲更好的解決方案是將用戶類型設置爲Enum或Flag。但我真的不明白如何在我的過程中使用它。

我想知道它們各自的優缺點&這是一個基本的例子,我可以在@ura中找到合適的值。

回答

0

我不知道,但可能是一個數組將是更好的解決方案:

class User .... 
    def getRoles 
     roles = Array.new 
     roles << "client" if self.client? 
     roles << "manager" if self.manager? 
     roles << "worker" if self.worker? 
     roles 
    end 
end 

before do 
    @user = session[:user] 
    if(@user.getRoles.index("manager") != nil) 
    ... 
+0

那有點兒類似於我在想什麼。看起來,使用'property:role',Enum [:client,:worker,:manager]'這樣的東西基本上可以讓我在一行中描述你的內容。我的理解是,某個事物只能一次枚舉Enum。 _(即''user.role =:worker'將會覆蓋:role的當前值)_而'Flag'可以將任何定義的值作爲一個屬性。我得到'Enum',但我不明白'Flag'的關係(例如,如何設置和取消設置'Flag'的特定值?*(可以在設置後取消設置?)*)_ –

+0

理想情況下,我希望能夠擁有'.client?'之類的東西,並且返回'true'或'false'。所以我可以做一些類似'if @ ura.client?'的事情。 _(我自己搞清楚代碼是否正確,我只是試圖找到表示這些信息的最佳方式。)_ –

相關問題