4

Добрый день.

class Ability

can :manage, Company do |company|
  user.available_roles.include?(company.role)
end

class User

belongs_to :company
delegate :admin?, :operator?, :agent?, :sales?, :visitor?, :available_roles, :role, to: :company

class Company

has_many :users

  def admin?
    role == 'admin'
  end

  def operator?
    role == 'operator'
  end

  def agent?
    role == 'agent'
  end

  def sales?
    role == 'sales'
  end

  def visitor?
    role == 'visitor'
  end

  def available_roles
    case role
      when 'admin'
        %w[visitor sales agent operator admin]
      when 'operator'
        %w[visitor sales agent]
      else
        []
    end
  end

class CompaniesController

  authorize_resource

  def new
    @company = Company.new
    respond_with @company
  end

  def create
    @company = Company.create(company_params)
    respond_with @company
  end

При создании Компаний, Админ может определить роль компаний %w[visitor sales agent operator admin]

При создании Компаний, Оператор может определить роль компаний только [visitor sales agent]

Через консоль: User.last это user с правами operator

» Ability.new(User.last).can? :manage, Company.new(role: :admin, name: 'Company Administrator')
              User Load (1.5ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" DESC LIMIT 1
              Company Load (0.8ms)  SELECT  "companies".* FROM "companies" WHERE "companies"."id" = $1 LIMIT 1  [["id", 4]]
# false

» Ability.new(User.last).can? :manage, Company.new(role: :agent, name: 'Company Agent')
          User Load (1.4ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" DESC LIMIT 1
          Company Load (0.5ms)  SELECT  "companies".* FROM "companies" WHERE "companies"."id" = $1 LIMIT 1  [["id", 4]]
# true

Но через веб интерфейс оператор может создать компанию с ролью admin и operator,

Подскажите пожалуйста, что не так?

2 Answers2

2

Помогло в class CompaniesController

authorize_resource заменил на load_and_authorize_resource

1

user.rb

attr_accessor :current_user

А в UsersController нужно в параметры добавить current_user:

User.new user_params.merge(current_user: current_user)
...
User.update user_params.merge(current_user: current_user)

Но это не самое лучшее решение, лучше давать право создавать в контроллере или сервисе

Yurii
  • 111