Роля по подразбиране на Cancancan

Създавам приложение за релси, което има известно разделение на роли\способности. Реших да използвам cancancan + devise, но не мога да разбера как да задам стандартна потребителска роля?

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

person Community    schedule 24.06.2015    source източник


Отговори (4)


Можете да направите обратно повикване на вашия потребителски модел:

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 не е подходящо, опитайте друго обратно извикване, повече информация тук

person neo    schedule 25.06.2015
comment
Този подход е възможен, но всъщност не е необходимо да съхранявате информация за ролята по подразбиране, защото това е просто потребител без никакви роли. - person kimrgrey; 15.01.2016

Когато дефинираме способности, ние използваме способност, наречена „потребител“ за потребителски разрешения по подразбиране. С други думи, потребител без други роли получава набор от способности по подразбиране.

Ние също така използваме набор от разрешения за „гости“ за посетители, които не са влезли.

person Tom H    schedule 15.01.2016

Можете да използвате следния модел, за да опростите 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
person kimrgrey    schedule 15.01.2016

Вместо обратно извикване бих задал стойност по подразбиране в поле или в изброяване.

class User
  include Mongoid::Document
  ...
  field :roles,       type: Array # ,  default: [:am]
  extend Enumerize
  enumerize :roles, in: [:superadmin, :am, :salesrep], multiple: true #,  default: :am
end
person Dmitry Polyakovsky    schedule 15.01.2016