Вы можете использовать следующий шаблон для упрощения 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
Этот подход возможен, но на самом деле вам не нужно хранить информацию о «роли по умолчанию», потому что это просто пользователь без каких-либо ролей. – kimrgrey