Я использую Pundit для авторизации и хочу поделиться логикой между классами политики. До сих пор я использовал простые рубиновые модули и включил их, но не нашел хорошего решения для классов Scope scudit.полномочия множественного наследства (областями, модулями)?
Например, предоставление доступа администратора к записям с определенным тегом совершенно не ограничивает их доступ к только опубликованным (не проектным или снятым/удаленным) записям.
Например
class PagePolicy < ApplicationPolicy
# restrict access to current pages
include PublishedOnlySharedPolicy
# enable section editors to update their tagged content
include TagsAclSharedPolicy
end
module TagsAclSharedPolicy
def update?
admin.in_tag_acl?(record) || super
end
def show?
admin.in_tag_acl?(record) || super
end
def scope
# ... can't do this?
end
end
Эти модули работают отлично для обычные методы ACL создать? Обновить? и т. д., но области являются головоломкой, поскольку они являются определениями классов вместо методов.
Я ожидаю, что состав области позволит мне взять область базового класса и ограничить ее добавлением, где утверждения обычно, или расширить его, используя супер, вырвать и создать новую область с помощью union.
Есть ли чистый способ сделать это без метапрограммирования? Или нужна ли библиотека для изменения динамических областей вместо использования определений классов?
Почему Pundit использует определения классов для областей в любом случае?