Cancancan roles_mask无法映射

时间:2017-04-05 01:46:34

标签: ruby-on-rails ruby devise cancancan

使用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]

无法解决这个问题以挽救我的生命

1 个答案:

答案 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