gpt4 book ai didi

ruby-on-rails - Rails 5 - 如何使用 Pundit

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

我花了 2 年的时间努力学习如何在我的 Rails 应用程序中使用 pundit,但现在我已经休息了很长时间。我回来了,正在努力学习如何使用 pundit。

我制作了一个全新的 Rails 5 应用程序并安装了 pundit。

我有一个用户资源、一个应用程序策略和一个用户策略。每个都有:

用户 Controller :

def index
# @users = User.all
@users = policy_scope(User)
end

申请政策

class ApplicationPolicy
attr_reader :user, :record

def initialize(user, record)
@user = user
@record = record
end

def index?
true
end

def show?
scope.where(:id => record.id).exists?
end

def create?
false
end

def new?
create?
end

def update?
false
end

def edit?
update?
end

def destroy?
false
end

def scope
Pundit.policy_scope!(user, record.class)
end

class Scope
attr_reader :user, :scope

def initialize(user, scope)
@user = user
@scope = scope
end

def resolve
scope
end
end
end

用户政策

class UserPolicy < ApplicationPolicy
class Scope < Scope
def resolve
scope.where(user: user)
end
end


end

然后在我的用户索引中,我尝试按照专家 gem 文档中的说明进行操作:

<% policy_scope(@users).each do |user| %>

我收到这个错误:

PG::UndefinedColumn: ERROR:  column users.user does not exist
LINE 1: SELECT "users".* FROM "users" WHERE "users"."user" = '566119...
^
: SELECT "users".* FROM "users" WHERE "users"."user" = '566119d2-54d8-4ab2-b7c5-f17c80b517f3' AND "users"."user" = '566119d2-54d8-4ab2-b7c5-f17c80b517f3'

谁能看出我是如何开始错误的?我什至还没有尝试以我想要的方式定义我的范围,但目前它不起作用。

最佳答案

class UserPolicy < ApplicationPolicy
class Scope < Scope
def resolve
scope.where(user: user)
end
end
end

scope.where 表示用户类 (user.where),因为它在用户策略中。

用户值为当前用户,由应用范围继承。

您发布的范围示例我猜您只想显示当前用户记录。然后你可以像上面的评论那样做:

scope.where(id: user.try(:id))

也因为你在controller中定义了一个scope

def index
# @users = User.all
@users = policy_scope(User)
end

您不需要在 View 中定义另一个。

 <% policy_scope(@users).each do |user| %>

这是一个或另一个。在 View 中,您可以简单地执行 users.each do....

关于ruby-on-rails - Rails 5 - 如何使用 Pundit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39848263/

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