1

我正在构建具有一些角色\能力分离的 Rails 应用程序。我决定使用 cancancan + devise,但我不知道如何设置标准用户角色?

class User < ActiveRecord::Base
  ROLES = %i[admin moderator author banned]
end
4

4 回答 4

1

您可以对您的用户模型进行回调:

class User < ActiveRecord::Base
  after_create :assign_default_role

  def assign_default_role
    add_role(:default_role) if self.roles.blank?
  end
end

如果 after_create 不合适,请尝试另一个回调,更多信息 在这里

于 2015-06-25T02:50:05.563 回答
0

在定义能力时,我们使用一个称为“用户”的能力作为默认用户权限。换句话说,没有其他角色的用户将获得默认的能力集。

我们还为未登录的访问者使用一组“访客”权限。

于 2016-01-15T14:30:45.637 回答
0

您可以使用以下模式来简化Ability类。请注意,此处为“默认”角色定义规则非常简单,因为它只是没有角色的登录用户。

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new

    # this is abitilites for anonymous user

    can :read, Post

    return unless user.persisted?

    # ok, now we know that this user is logged in and can define common abilities

    can :create, Post

    # and after it we can define abilities for different roles
    # user.roles here should return name of roles for user, 
    # like [:admin, :moderator]

    user.roles.each { |role| self.public_send(role, user) if respond_to?(role) }
  end

  def admin(user)
    # abitlites for admin here
  end

  def moderator(user)
    # abilities for moderator here
  end
end
于 2016-01-15T14:52:37.283 回答
0

我会在字段或枚举中设置默认值,而不是回调。

class User
  include Mongoid::Document
  ...
  field :roles,       type: Array # ,  default: [:am]
  extend Enumerize
  enumerize :roles, in: [:superadmin, :am, :salesrep], multiple: true #,  default: :am
end
于 2016-01-15T21:15:38.843 回答