Rails Pundit政策是如何运作的?

时间:2017-05-27 07:27:02

标签: ruby-on-rails devise pundit

我在ruby on rails上有一个web应用程序,其中包括设计认证和专家作为授权。

我的模型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用户。我在哪里错了代码?

谢谢

1 个答案:

答案 0 :(得分:0)

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

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

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

authorize Page