Rails Pundit 政策是如何运作的?

Rails Pundit how the policies are worknig?

我在 rails 上的 ruby 中有一个 Web 应用程序,使用 devise 作为身份验证,pundit 作为授权。

我有一个模型 user,其整数 role 属性的值为 0、1、2,用于 visitorvipadmin分别。我也有一个脚手架,比如 Page 我只想 vipadmin 可以访问而不是 visitor 用户。

在page_policy.rb我有

def index?
  current_user.vip? or current_user.admin?
end

在 pages_controller.rb 中有一行 authorize current_user。 虽然我已经授予 vip 访问权限,但它仅供 admin 用户使用。我的代码哪里出错了?

谢谢

我假设您已经在 User 模型上正确设置了谓词方法 vip?admin?,这些方法是否按预期工作?你能检查一下你当前用户调用这些方法的结果吗?

Pundit 实际上将 current_user 的结果传递给您的策略初始值设定项,您可以通过策略方法中的 user 方法访问它。此外,在这种情况下我会小心使用 or 运算符(请参阅 http://www.virtuouscode.com/2010/08/02/using-and-and-or-in-ruby/)。

所以我会尝试:

def index?
  user.vip? || user.admin?
end

此外,专家希望您将正在检查的 资源 传递给 authorize 方法,而不是用户对象。如果没有要传递的实例,可以传递 class:

authorize Page