2017-06-13 65 views
1

如果他們向我支付現金(管理員),我必須更改客戶表格。假設的現金,而不是真正的現金。因此,爲了改變形式,我已經使用了這樣的事情:我該如何檢查當前用戶是否是rails中的admin?

if current_user.user_type == :client 
    show normal form 
elsif current_user.user_type == :admin 
    show normal form + more functionality 
end 

那麼,什麼是貫徹落實「USER_TYPE」功能的最佳方法是什麼?我正在考慮將該函數添加到User類,如下所示。退貨:賣家和退貨:客戶正常工作。我已經測試過了。我可以檢查當前用戶的電子郵件和密碼嗎(current_user是我的密碼和電子郵件)?這似乎並不奏效。最好的辦法是做什麼?

class User < ActiveRecord::Base 
    has_one :client 
    has_one :seller 

    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    acts_as_messageable 

    def user_type 
     return :client if self.client(&:info_complete?) 
     return :seller if self.seller(&:info_complete?) 
     return :admin if (self.email == '[email protected]' && self.password == 'admintestpass') 
    end 
end 
+2

我過去所做的就是添加一列,以所謂的'role'或類似的東西用戶表,然後使它枚舉。 Rails枚舉很好用。 http://api.rubyonrails.org/v5.1.0/classes/ActiveRecord/Enum.html。我不願意認可你的解決方案的唯一原因是,如果確定角色的邏輯變得更加複雜,那麼存儲角色比每次計算角色更有意義。如果您希望我詳細說明枚舉解決方案的步驟,請告訴我 –

+0

@ 0101001101000010是的,請!另外,我的方式會讓一切都變慢嗎?因爲它每次都會計算? – LizzyTheLearner

+0

我認爲真正的懲罰會隨着可維護性而來,而不是那麼多的表現。現在你有一個非常簡單的方法來告訴誰是管理員,但是如果這個規則改變了,該怎麼辦?如果您創建另一個電子郵件爲「me @ random.hotmail.net」的管理員,該怎麼辦?你將不得不改變你的規則,如果最終你有幾十個管理員,那麼制定一條規則來管理他們將是一場噩夢。永久存儲用戶角色更容易。我通常創建一個管理員頁面,管理員可以更改用戶角色。另外,檢查用戶密碼通常不是一個好主意。 –

回答

1

好了,所以你首先需要創建一個遷移到添加一列(我將它命名爲role,不要使用type,因爲它會導致以後的問題)到用戶表。我假設你知道如何編寫遷移,如果不是在評論中要求示例。該列需要是intnull: false, defaul: 0是避免某些用戶沒有角色的好主意。然後來的模型:

這是哪裏的軌道枚舉保存一天。在我的例子,假設列被命名爲role

model User < ApplicationRecord #boilerplate stuff 
     enum role: [ :client, :seller, :admin ] # These are the different possible roles 

     def assign_role 
     if # logic to decide role here 
      self.update_attribute(:role, :admin) # This makes the user admin 
     else 
      self.update_attribute(:role, :client) # This makes the user client 
     end 
     end 
    end 

注:不需要分配的作用方法枚舉的工作,我只是說,所以你可以看到如何分配角色,並將它們保存到用戶。

然後在您的控制器(或查看如果你想)你可以檢查,如果用戶是管理員通過:
user.admin? # true if admin, false otherwise

您可以爲所有角色做同樣的(檢查提供了更充分的說明文檔): user.client? # true if client, false otherwise user.seller? # true if seller, false otherwise

最後一件事要記住,如果你的列有default: 0,第一項在enum名單將默認的角色,在這種情況下,它是client。創建新用戶時,您需要牢記這一點。

最後,文檔:http://api.rubyonrails.org/v5.1.0/classes/ActiveRecord/Enum.html

相關問題