康康康roles_mask 未映射
Cancancan roles_mask not mapping
使用最基本的cancancan实现,感觉快要疯了。
这是我的用户模型中的内容
ROLES = %i[admin regular reporter]
# Roles logic to covert string above to/from integers
def roles=(roles)
roles = [*roles].map { |r| r.to_sym }
self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
end
def roles
ROLES.reject do |r|
((roles_mask.to_i || 0) & 2**ROLES.index(r)).zero?
end
end
def has_role?(role)
roles.include?(role)
end
1 的用户正在显示角色:admin
用户 2 正在显示角色:常规
但拥有 3 的用户正在显示角色 [:admin, :regular]
想不出来救命
如果我对你的问题的理解正确,3 是 [:admin, :regular]
的正确 roles_mask
。
如果您尝试将 User
设置为 reporter
,它不会是 3,而是 4。
这是因为 roles=
方法以最基本的用法将您的 ROLES
数组转换为:
ROLES_MAP = [1, 2, 4]
(...因此允许通过简单地将数字相加来组合多个角色)
但是,如果您想将用户对象设置为记者,您应该使用:
: @user.roles = "reporter"
最好不要直接设置roles_mask
,像这样:
: @user.roles_mask = 4
使用最基本的cancancan实现,感觉快要疯了。
这是我的用户模型中的内容
ROLES = %i[admin regular reporter]
# Roles logic to covert string above to/from integers
def roles=(roles)
roles = [*roles].map { |r| r.to_sym }
self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
end
def roles
ROLES.reject do |r|
((roles_mask.to_i || 0) & 2**ROLES.index(r)).zero?
end
end
def has_role?(role)
roles.include?(role)
end
1 的用户正在显示角色:admin
用户 2 正在显示角色:常规
但拥有 3 的用户正在显示角色 [:admin, :regular]
想不出来救命
如果我对你的问题的理解正确,3 是 [:admin, :regular]
的正确 roles_mask
。
如果您尝试将 User
设置为 reporter
,它不会是 3,而是 4。
这是因为 roles=
方法以最基本的用法将您的 ROLES
数组转换为:
ROLES_MAP = [1, 2, 4]
(...因此允许通过简单地将数字相加来组合多个角色)
但是,如果您想将用户对象设置为记者,您应该使用:
: @user.roles = "reporter"
最好不要直接设置roles_mask
,像这样:
: @user.roles_mask = 4