Rails 5,使用命名空间资源的Pundit



我想弄清楚如何使用pundit与我的命名空间资源。

我读了很多其他人的SO帖子,说他们有这个问题,但那些早于pundit gem问题跟踪器上的讨论。问题跟踪器不清楚解决方案是什么-所以我被卡住了。

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

模型。Rb文件名为:

class Stance::Overview < ApplicationRecord

控制器名为:

class Stance::OverviewsController < ApplicationController

数据库中的表叫做:

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

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

我试着用一个名为overview_policy的文件创建一个名为Stance的文件夹。rb:

class Stance::OverviewPolicy < ApplicationPolicy

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

<% 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 ?

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

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

Pundit.policy(current_user,[:stance, :overview]).show?会发现show?在app/政策/态度/overview_policy.rb。

如果您在控制器中写入authorize [:stance, @overview] on show,它将找到show?在app/政策/态度/overview_policy.rb。

最新更新