如何让 Pundit 将范围应用于与策略名称不同的模型?

How to get Pundit to apply a scope to a model with a different name than the policy?

我有一个 DirectoryController,并且有意没有 UsersController。 UsersController 无疑会在我创建管理控件时添加,并且具有完全不同的范围和目的。

当我在目录控制器中调用 policy_scoped 时,我想使用 DirectoryPolicy 的作用域,而不是 UserPolicy(尚不存在)。我想以 verify_policy_scoped 识别的方式进行,这意味着 DirectoryPolicy::Scope.new(current_user, User).resolve 的明显解决方法不仅有点长而且实际上不起作用。 (这似乎是一个错误)这似乎是一个明显的疏忽,我确信在某处有一些东西可以使这项工作正常进行,我只是不知道是什么。

我如何在 Pundit 中执行此操作?

当你这样做时

DirectoryPolicy::Scope.new(current_user, User).resolve

您实际上绕过了专家的 policy_scoped? 跟踪。

我的第一个想法是,如果 DirectoryPolicy::Scope 旨在确定用户数据的范围,也许您需要创建一个 Directory 模型,正如专家所期望的那样。可以这么简单

class Directory < User; end

现在当你的 DirectoryController

中有这样的东西时
@users = policy_scope(Directory)

专家可以正确推断出您想要 DirectoryPolicy::Scope,并且您的 resolve 方法可以将 scope 视为 User class,因为继承。

如果您不能像我在此处描述的那样子class User,您将需要显示您应用中的一些实际代码,并提供更多关于 Directory 是什么的上下文以及你想用它做什么。