#ruby_on_rails
Добрый день.
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,
Подскажите пожалуйста, что не так?
Ответы
Ответ 1
Помогло в class CompaniesController authorize_resource заменил на load_and_authorize_resourceОтвет 2
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) Но это не самое лучшее решение, лучше давать право создавать в контроллере или сервисе
Комментариев нет:
Отправить комментарий