我在尝试学习如何在我的rails应用程序中使用pundit的过程中,有两年的努力。我回来试图学习如何使用专家。
我已经制作了一个全新的rails 5 app并安装了专家。
我有用户资源,应用程序策略和用户策略。每个人都有:
用户控制器:
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
然后在我的用户索引中,我尝试按照权威宝石文档中的说明操作:
<% 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'
任何人都可以看到我是如何开始错误的吗?我还没有尝试以我想要的方式定义我的范围,但它现在还没有工作。
答案 0 :(得分:1)
class UserPolicy < ApplicationPolicy
class Scope < Scope
def resolve
scope.where(user: user)
end
end
end
scope.where表示User类(user.where),因为它在用户策略中。
用户值是当前用户,由应用程序范围继承。
您发布的范围示例我猜测您只想显示当前用户记录。然后您可以执行以下注释:
scope.where(id: user.try(:id))
另外,因为您已在控制器中定义了范围
def index
# @users = User.all
@users = policy_scope(User)
end
您不需要在视图中定义另一个。
<% policy_scope(@users).each do |user| %>
它是一个或另一个。在视图中,您只需执行用户即可....