@rail01y

Как корректно сделать связку в геме the_role?

Доброго времени суток, пробую сделать связку гема the_role + devise + the_role_dashboard и в частности столкнулся с проблемой в связке один пользователь - несколько ролей. Роли как бы выставляются, но при этом к dashboard доступа не имею (руби учи на лету, не ругайте строго)
routes.rb
Rails.application.routes.draw do
  TheRoleManagementPanel::Routes.mixin(self)
  devise_for :users
  resources :dashboard, only: [:index]
  root 'home#index'
end


models/user.rb
class User < ApplicationRecord
  include TheRole::Api::User
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :user_roles
  has_many :roles, :through => :user_roles

  def role?(role)
    roles.any? { |r| r.name.underscore.to_sym == role }
  end

end


models/user_role.rb
class UserRole < ApplicationRecord
  belongs_to :user
  belongs_to :role
end


modes/role,rb
class Role < ActiveRecord::Base
  include TheRole::Api::Role
  has_many :user_roles
  has_many :users, :through => :user_roles
end


сам конфиг the_role который лежит в initial

config.login_required_method = :authenticate_user!
config.layout = :the_role_management_panel
config.layout_title = 'M2 Role Controller'
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
AlexanderMint
@AlexanderMint
Web Developer
Сразу скажу что данный гем не использовал, но напишу как можно сделать иначе, вдруг пригодится...

Пример что ниже описывает как можно реализовать простую роль или роль к "компании"

Модель Role
class Role < ApplicationRecord
  belongs_to :user
  belongs_to :company, optional: true

  validates :user, :name, presence: true
  enum name: %i[admin manager]
end


И например отрывок из модели User
has_many :roles, dependent: :destroy

def create_role(role_name, company = nil)
  roles.create(name: Role.names[role_name], company: company)
end

def role?(role_name, company = nil)
  if company.present?
    roles.where(name: Role.names[role_name], company: company).any?
  else
    roles.where(name: Role.names[role_name]).any?
  end
end

def admin?
  role? 'admin'
end

def manager?(company)
  role? 'manager'
end


Дальше все просто

# Fake
user = User.first
company = Company.first


Создать роль администратора:
user.create_role :admin

Создать роль владельца компании:
user.create_role :manager, company

Проверить роль администратора:
user.admin?

Проверить роль к компании:
user.manager? company

А ограничить доступ "по ролям" можно простым гемом pundit
Возможно где то опечатался, писал от руки
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы