簡體   English   中英

我不知道如何在我的 rails 應用程序中處理用戶角色以及使用 cancancan gem

[英]I don not know how to handle user roles in my rails app along with using cancancan gem

我是 Rails 的新手,我正在嘗試構建一個具有三個角色的用戶模型的應用程序:管理員、成員和訪問者。 我已經設置了應用程序並安裝了 cancancan 並設計了 gems。 然后,我通過遷移向用戶模型添加了“角色”,這為用戶提供了“訪問者”默認角色:

  def change
    add_column :users, :role, :integer, default: 0
  end
end

然后,我通過定義授權來設置 cancan 能力:


class Ability
  include CanCan::Ability

  def initialize(user)
    alias_action :create, :read, :edit, :update, :destroy, to: :crud  # The first argument to `can` is the action you are giving the user
    if user.admin?
      can :manage, :all 
    elsif user.member?
      can :crud, Item, user_id = user.id 
    elsif user.visitor?
      can :read, all
    end  
  end

end

我想我可能需要為用戶定義角色,以便稍后在整個應用程序中檢查他們的授權:

class User < ApplicationRecord 
  enum role: [:visitor, :member, :admin] 
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :items

  def admin?(user)
    if user.role == 2
      return true
    end
  end

  def member?(user)
    if user == current_user
      user.role = 1
      return true
    end
  end   

  def visitor?(user)
    if user != current_user && user.role != 2
      user.role = 0 
      return true
    end 
  end

end

由於我沒有配置應用程序讓用戶選擇他們的角色,並且應該有一個“管理員”,我通過在 rails 控制台中更改我的用戶角色(默認為“訪客”)將自己設置為“管理員”。 我在控制器中使用了“byebug”來查看我的角色是否已修改為“admin”; 然而,它仍然是“訪客”。 然后我退出並作為另一個用戶進入,我希望有一個“成員”角色,但它是“訪客”。 我確定我沒有在適當的位置定義角色,我無法更新它們以便在用戶登錄時擁有適當的角色; 我期望每個人都可以成為訪客,除非他/她注冊或登錄,並且在授權完成后用戶的角色應該更改為“成員”。 所以在這個階段,用戶的角色、身份驗證和 cancan 之間沒有聯系。 我非常感謝任何幫助我建立這些聯系的說明。 謝謝

enum role: [:visitor, :member, :admin]是否已經生成了visitor?的詢問方法visitor? member? admin? .

所以你真正需要的是:

class User < ApplicationRecord 
  enum role: [:visitor, :member, :admin] 
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :items
end

然后你可以調用user.visitor? 測試用戶是否為訪問者或調用user.role以獲取枚舉鍵( "visitor" )。

你的admin? member? visitor? 由於以下幾個原因,方法被完全破壞:

  • user.role不返回整數。 它將枚舉映射作為字符串(“visitor”、“member”、“admin”)返回,因此整數比較將始終為 false,並且該方法將始終返回 false。 請參閱文檔
  • current_user在模型中不可用,因為它們不知道請求。 這是一個輔助方法,可在您的控制器和視圖中使用。 如果您為此代碼編寫單元測試,您會發現它引發了 NoMethodError。

還有一些小錯誤,例如:

can :crud, Item, user_id = user.id

在這里,您實際上是在分配一個局部變量,因此此代碼等效於:

can :crud, Item, user.id

你想使用冒號:

can :crud, Item, user_id: user.id
# which is short-hand for
can :crud, Item, { :user_id => user.id }

我期望每個人都可以成為訪客,除非他/她注冊或登錄,並且在授權完成后用戶的角色應該更改為“成員”。

這是一個非常沒有根據的期望。 如果你想要這個邏輯,你需要通過回調或自定義設計控制器來實現它。

Devise 實際上沒有訪客用戶功能——盡管可以添加一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM