@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'
  • Вопрос задан
  • 155 просмотров
Решения вопроса 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
Возможно где то опечатался, писал от руки
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы