gpt4 book ai didi

ruby-on-rails - 在 Pundit 中使用没有可用实例变量的策略助手

转载 作者:数据小太阳 更新时间:2023-10-29 08:20:30 25 4
gpt4 key购买 nike

所以我决定尝试pundit用户授权解决方案。我想知道如何在实例变量可能为 nil 的情况下使用 policy 助手,如下面的简单情况:

应用/views/projects/index.html.slim

h1 Projects
(...)
- if policy(@project).create?
= link_to 'New Project', new_project_path

app/controllers/projects_controller.rb

(...)
def index
@projects = Project.all
end
(...)

app/policies/project_policy.rb

class ProjectPolicy < Struct.new(:user, :project)
def create?
user.has_role? :admin
end

我想在 Projects#index 页面上显示“新项目”链接,但我在该 View 中没有可用的 @project 实例变量,出现错误:

Pundit::NotDefinedError in Projects#index

unable to find policy NilClassPolicy for

错误的出现显然是因为我确实传递了 nil 的 @project 实例变量,因此有一个 NilClass,显然我不需要授权。

我发现了 2 种解决此问题的方法,可以使其正常运行,但似乎都不合适:

  1. 在 View 中使用现有的@projects 变量,即:policy(@projects[0])
  2. 在 projects#index controller action 中添加一行来定义这个实例变量,例如。 @project = Project.new(或者直接在 View 中类似上面:policy(Project.new))

第一个解决方案会导致@projects 数组中的相同错误为空,而第二个解决方案会创建冗余实例变量。所有策略助手需要知道的是我想在哪个类上强制执行授权逻辑。

关于实现它的正确方法有什么建议吗?

最佳答案

您提出的第二个解决方案就是我所做的。

- if policy(@project).create?
= link_to 'New Project', new_project_path

此处对新记录的策略检查应使用 Project.new (无论是否分配给实例变量)

- if policy(Project.new).create?
= link_to 'New Project', new_project_path

无论如何,Project 的实例必须传递给 policy 帮助器,以便 Pundit 派生策略类 ProjectPolicy执行 create? 检查查找。当您传入 nil 时,这就是您看到 Pundit 派生 NilClassPolicy 的原因。

关于ruby-on-rails - 在 Pundit 中使用没有可用实例变量的策略助手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18420846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com