【问题标题】:Rails 5, Pundit with namespaced resourcesRails 5,具有命名空间资源的 Pundit
【发布时间】:2017-03-17 19:26:26
【问题描述】:

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

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

我有一个名为 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

在我的组织视图(有一个立场::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 帖子的猜测,其中大部分都早于权威问题跟踪器上的对话。

我没有收到错误消息,但内容没有按时呈现。

谁能看到我需要做什么才能将权威人士与命名空间资源一起使用?

【问题讨论】:

  • 您是否有名为 Stance 或 stand 的策略文件的 stand 文件夹?我认为它需要全部小写。我们有一个与我们的一个模型类似的设置,它工作正常。不过,唯一的授权是在控制器中。
  • 我的策略文件夹中有一个名为“stance”的小写文件夹。您如何在政策中命名您的班级?我正在这样做:class Stance::OverviewPolicy
  • 这正是我的设置方式。你得到什么错误?

标签: ruby-on-rails ruby namespaces pundit


【解决方案1】:

当我遇到命名空间问题时,我使用 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] on show,它会找到show?在 app/policies/stance/overview_policy.rb 中。

【讨论】:

    猜你喜欢
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多