2015-06-24 2 views
1

Я создаю приложение rails, у которого есть некоторая роль \ способность разделения. Я решил использовать cancancan + devise, но я не могу понять, как установить стандартную роль пользователя?Роль по умолчанию в Cancancan

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

ответ

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 не подходит, попробуйте другой обратный вызов, подробнее here

+0

Этот подход возможен, но на самом деле вам не нужно хранить информацию о «роли по умолчанию», потому что это просто пользователь без каких-либо ролей. – kimrgrey

0

При определении способностей, мы используем способность «пользователь» для пользовательских разрешений по умолчанию. Другими словами, пользователь, не имеющий других ролей, получает набор возможностей по умолчанию.

Мы также используем набор разрешений «гость» для посетителей, которые не подписаны в.

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 
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 
Смежные вопросы