使用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]
无法解决这个问题以挽救我的生命
答案 0 :(得分:1)
如果我正确理解您的问题,则roles_mask
的正确[:admin, :regular]
为3。
如果您尝试将User
设置为reporter
,则不会是3但实际上是4。
这是因为使用最基本用法的roles=
方法会将您的ROLES
数组转换为:
ROLES_MAP = [1, 2, 4]
(...因此,只需将数字加在一起即可组合多个角色)
但是,如果要将User对象设置为报告者,则应使用:
:@user.roles = "reporter"
最好不要直接设置roles_mask
,如下所示:
:@user.roles_mask = 4