所以我决定尝试权威的用户授权解决方案。我想知道如何policy
在实例变量可能为 nil 的情况下使用帮助程序,如下面的简单情况:
应用程序/视图/项目/index.html.slim
h1 Projects
(...)
- if policy(@project).create?
= link_to 'New Project', new_project_path
应用程序/控制器/projects_controller.rb
(...)
def index
@projects = Project.all
end
(...)
应用程序/策略/project_policy.rb
class ProjectPolicy < Struct.new(:user, :project)
def create?
user.has_role? :admin
end
我想在 Projects#index 页面上显示“新项目”链接,但我在此视图中没有可用的 @project 实例变量,出现错误:
Pundit::NotDefinedError 项目#index
找不到政策 NilClassPolicy
显然出现错误是因为我确实传递@project
了 nil 的实例变量,因此有一个 NilClass 显然我不需要授权。
我发现了 2 个解决此问题的方法,使其正常运行,但它们似乎都不合适:
- 利用视图中现有的@projects 变量,即:
policy(@projects[0])
- 向定义此实例变量的 projects#index 控制器操作添加一行,例如。
@project = Project.new
(或直接在类似于上面的视图中policy(Project.new)
:)
第一个解决方案将导致 @projects 数组中的相同错误为空,而第二个解决方案会创建冗余实例变量。所有策略助手需要知道的是我想在哪个类上强制执行授权逻辑。
关于实现它的正确方法的任何建议?