使用`roles_mask`

时间:2018-02-01 21:20:07

标签: ruby-on-rails ruby-on-rails-5 cancan

我正在尝试使用CanCan gem为新users分配默认角色。管理员可以为用户分配多个角色。为此,我添加了以下代码:

# User's role handler (More information: https://github.com/ryanb/cancan/wiki/role-based-authorization)
# This will perform the necessary bitwise operations to translate an array of roles into the integer field
ROLES = %w[admin moderator user banned].freeze

def roles=(roles)
  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

# Role Inheritance
def role?(base_role)
  ROLES.index(base_role.to_s) <= ROLES.index(role)
end

# Check the user's roles
def is?(role)
  roles.include?(role.to_s)
end

我想定义默认用户角色(:user),我发现了这个问题:Rails Cancan: Defining Default Role on Signup 。它说我必须简单地添加set_default_role方法:

before_create :set_default_role

private
  def set_default_role
    self.role ||= Role.find_by_name('your_role')
  end

但问题是我使用了另一种添加新角色的方法。我必须存储一个整数而不是字符串。此外,当您为用户分配角色时,它会将特定索引存储到users table。我的想法是将default: 4值添加到数据库中的roles列,但我注意到向数据库添加新角色会更改user index number。换句话说,如果user role等于4,则更新后它将为8(例如)。

问题是如何将默认角色分配给用户?

非常感谢你的帮助和时间!

0 个答案:

没有答案