【问题标题】:Cancancan roles_mask not mappingCancancan 角色掩码未映射
【发布时间】:2017-04-05 01:46:33
【问题描述】:

使用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 的用户正在显示角色 :regular

但是 3 的用户显示角色 [:admin, :regular]

想不通以挽救我的生命

【问题讨论】:

    标签: ruby-on-rails ruby devise cancancan


    【解决方案1】:

    如果我正确理解您的问题,3 是正确的 roles_mask 对应于 [:admin, :regular]

    如果您尝试将 User 设置为 reporter,则它不会是 3 而实际上是 4。

    这是因为roles= 方法,用最基本的用法,将你的ROLES 数组转换为:

    ROLES_MAP = [1, 2, 4]

    (...因此只需将数字相加即可组合多个角色)

    但是,如果您想将用户对象设置为记者,您应该使用:

    ?:@user.roles = "reporter"

    最好不要直接设置roles_mask,像这样:

    ?:@user.roles_mask = 4

    【讨论】:

    • 感谢您的回复,我最终通过使用您建议的设置符号而不是角色掩码的方法弄清楚了这一点。我很好奇为什么它将数组转换为 1、2、4?我假设一个额外的角色是 8 的角色掩码?为什么这是典型的解决方案?
    • 是的,对于您使用的特定代码,它允许您为用户提供多个角色,所有角色都存储在一个数字值中,我猜是作为一个字段存储在数据库表中。
    • (如果您只希望每个用户拥有一个角色,您可以删除那里的所有代码,只保留一个普通的旧索引数组。)
    猜你喜欢
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2020-10-18
    • 2019-04-13
    • 2015-11-28
    • 2015-04-12
    • 1970-01-01
    相关资源
    最近更新 更多