我正在使用Pundit进行授权,并希望在策略类之间共享逻辑。到目前为止,我一直在使用普通的ruby模块和包含,但还没有为专家的Scope类找到一个好的解决方案。
例如,授予对具有特定标记的记录的管理员访问权限与将其限制为仅发布(不是草稿或已停止/已删除)记录完全不同。
例如
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方法创建吗?更新?等等,但范围是一个难题,因为它们是类定义而不是方法。
我期望范围构成让我采用基类的范围并通过像往常一样添加where语句来限制它,或者通过使用super,pluck和使用union构建新范围来扩展它。
没有元编程,有没有一种干净的方法可以做到这一点?或者库是否需要更改以支持动态范围而不是使用类定义?
为什么Pundit还会为范围使用类定义?
答案 0 :(得分:0)
如果有人好奇的话,https://github.com/elabs/pundit/issues/310会有答案。
基本上将白名单ID方法添加到应用程序策略的范围,然后在每个策略的范围类中使用普通ruby覆盖它,任何共享范围代码都在其自己的模块中并包含在范围内
或许可以将某些东西编程成干燥器,但这样可行。