ruby-on-rails - Rails 5,具有命名空间资源的 Pundit

标签 ruby-on-rails ruby namespaces pundit

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

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

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

model.rb 文件被称为:

class Stance::Overview < ApplicationRecord

Controller 被称为:
class Stance::OverviewsController < ApplicationController

数据库中的表称为:
create_table "stance_overviews", force: :cascade do |t|

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

我试过用一个名为overview_policy.rb的文件创建一个名为Stance的文件夹,其中包含:
class Stance::OverviewPolicy < ApplicationPolicy

在我的组织 View (有一个 stance::overview)中,我定义了一个局部变量):
<% if current_user.organisation_id != @organisation.id %>

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

然后在 View 中,我正在尝试:
<% if policy(overview).show? %> 

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

<% end %>

我找不到对此有效的变体。我尝试过的一切都是基于 SO 帖子的猜测,其中大部分帖子早于专家问题跟踪器上的对话。

我没有收到错误消息,但内容没有在应该呈现的时候呈现。

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

最佳答案

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

对于您的类(class),我认为应该使用 Pundit.policy(current_user,[:stance, :overview]).show?在查看和使用 authorize [:stance, @overview]在 Controller 中。
Pundit.policy(current_user,[:stance, :overview]).show?会找节目吗?在 app/policies/stance/overview_policy.rb 中。

如果你写 authorize [:stance, @overview]在您的 Controller 中显示时,它会找到 show?在 app/policies/stance/overview_policy.rb 中。

关于ruby-on-rails - Rails 5,具有命名空间资源的 Pundit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40414584/

相关文章:

ruby-on-rails - 在登台时引发禁用属性错误

sql - 对多个父记录的子项属性进行 SUM 运算

ruby-on-rails - 设计中的 ArgumentError::RegistrationsController#new 错误的参数数量(2 代表 0..1)

ruby - MiniMagick:使 png 部分不透明/如何使用 '-evaluate'

F#、命名空间、模块、fs 和 fsx

php - 拉维尔 5 : How can I add seeder class to autoload?

jquery - 单击链接时在 div 中渲染部分内容

ruby-on-rails - 测试套件多长时间太长?

ruby-on-rails - Rspec Controller 测试中的 response.body 返回空字符串

C# 包命名空间