![](/img/trans.png)
[英]How to handle if one of user's role (say teacher) have many other roles in rolify and 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.