我想弄清楚如何使用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。