康康康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