Rails 5,具有命名空间资源的Pundit

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails 5,具有命名空间资源的Pundit相关的知识,希望对你有一定的参考价值。

我正在试图弄清楚如何将pundit与我的命名空间资源一起使用。

我已经阅读了很多来自其他人的SO帖子,说他们有这方面的问题,但那些早于对专家宝石问题跟踪器的讨论。问题跟踪器不清楚解决方案是什么 - 所以我被卡住了。

我有一个名为Stance的文件夹,它是嵌套资源的命名空间,其中一个名为overview。

调用model.rb文件:

class Stance::Overview < ApplicationRecord

控制器被称为:

class Stance::OverviewsController < ApplicationController

db中的表称为:

create_table "stance_overviews", force: :cascade do |t|

在我的app / policies文件夹中,我尝试了各种制定策略的方法,然后尝试在视图中引用策略。我找不到一种有效的方法。

我尝试使用名为overview_policy.rb的文件创建一个名为Stance的文件夹,其中包含:

class Stance::OverviewPolicy < ApplicationPolicy

在我的组织视图(有一个立场::概述)中,我定义了一个局部变量):

<% if current_user.organisation_id != @organisation.id %>

    <%= render 'stance/overviews/internal', overview: @organisation.overview %>
<% else %>
    <%= render 'stance/overviews/external', overview: @organisation.overview  %>
<% end %>   

然后在视图中,我正在尝试:

<% if policy(overview).show? %> 

<p><%= overview.explanation %></p>

<% end %>

我无法找到有效的变体。我尝试的所有内容都是基于SO帖子的猜测,其中大部分都是在专家问题跟踪器上进行的对话之前。

我没有收到错误消息,但内容不应该呈现。

任何人都可以看到我需要做什么才能将权威与命名空间资源一起使用?

答案

当我遇到命名空间问题时,我使用Pundit.policy()。

对于你的班级,我认为应该在视图中使用Pundit.policy(current_user,[:stance, :overview]).show?并在控制器中使用authorize [:stance, @overview]

Pundit.policy(current_user,[:stance, :overview]).show?会找到节目吗?在app / policies / stance / overview_policy.rb中。

如果您在控制器上显示authorize [:stance, @overview],它会显示?在app / policies / stance / overview_policy.rb中。

以上是关于Rails 5,具有命名空间资源的Pundit的主要内容,如果未能解决你的问题,请参考以下文章

Rails 6 - Pundit“策略包装器”

具有两个输入参数的 Pundit 策略

Rails 命名空间与嵌套资源

Rails:form_for 命名空间资源

Rails 不区分嵌套在相同命名空间中的两个资源

Rails 4 - pundit - 如何编写 if 语句来检查用户权限