我是Pundit宝石的新手,我坚持不懈。
我尝试显示包含多条记录的列表,但我总是收到错误AuthorizationNotPreformedError。
我做错了什么?
控制器:
def planning
@plans = Order.all
authorize @plans
end
策略:
def planning?
user.present?
end
Planning.html.haml
%h1 test
当我添加此内容时:after_action :verify_policy_scoped, :only => planning, if: verify_policy_scoped?
我收到了PolicyScopingNotPerformedError。
答案 0 :(得分:1)
来自the README:
Pundit会跟踪您是否在控制器操作中的任何位置调用
的方法authorize
。 Pundit还为您的控制器添加了一个名为verify_authorized
...
Pundit还会向您的控制器添加
verify_policy_scoped
。这将引发类似于verify_authorized
的异常。但是,它会跟踪是否使用policy_scope
而不是authorize
。
你已经混合了这两种方法。您已调用authorize
,但正在检查是否已调用policy_scope
。
policy_scope
通常用于记录的集合(例如您的示例,或更常见的index
操作),而authorize
通常用于< strong>个人记录(例如show
/ edit
/ update
/ destroy
操作。
但是,在您的情况下,您目前所拥有的内容并不一定能保证一项政策 - 您所检查的是用户是否已登录!
如果您要求用户登录,但他们不是,则您的应用程序应回复401
错误,而不是403
。例如,您可以在控制器中执行此操作before_action :authorize
。 (这取决于您如何实施授权 - 请参阅您正在使用的任何库的文档,例如devise
)。