gpt4 book ai didi

ruby-on-rails-4 - 如何使用权威范围?

转载 作者:行者123 更新时间:2023-12-04 01:46:57 27 4
gpt4 key购买 nike

我刚刚从 CanCan 切换到 Pundit。我不确定几件事,以及如何最好地使用 Pundit。

例如:

如果您有一个可以有多个父对象的资源,例如,假设一个目标属于学生和教师。因此,一个学生可以有很多目标,而一个教师可以有很多目标。在 Controller 索引操作中,您可能会这样做:

if params[:student_id].present?
@account = Student.find(params[:student_id])
@goals = @account.goals
elsif params[:instructor_id].present?
@account Instructor.find(params[:instructor_id])
@goals = @account.goals
end
params在策略内部不可用,因此需要在此处完成逻辑。我认为。据我所知,如果您跳过 policy_scope查看目标的索引页面时,您将收到未经授权的错误。

你会:
@goals = policy_scope(@account.goals)

或者
@goals = policy_scope(Goal.scoped).where( account_id: @account.id)

当您将一堆包含在混合中时会发生什么?
  @example = policy_scoped(@school.courses.includes(:account => :user, :teacher ))

或者在需要订购时......这是正确的吗?
 policy_scope(Issue.scoped).order("created_at desc")

使用范围时: :scope 是什么?这里?是 :scope正在评估的模型的实例?我尝试通过 :scope 访问它的属性,但没有用。
  class Scope < Struct.new(:user, :scope)

最佳答案

从安全的角度来看,我可以看到一些值得一提的事情。例如,如果您允许用户指定 student_idinstructor_id参数字段,是什么阻止他们为自己以外的人传递 ID?您永远不想让用户指定他们是谁,尤其是当您基于用户类型制定策略时。

对于初学者,我将实现 Devise 并添加一个名为 instructor 的附加 bool 字段。那将是 true当用户是讲师但默认为 false 时为学生。

然后你的User s 将自动具有 instructor?方法定义,将返回 true如果 instructor 中的值列是 true .

然后,您可以为学生添加一个助手:

def student?
!instructor?
end

现在使用 Devise(它让我们可以访问 current_user 变量)我们可以做类似 current_user.instructor? 的事情。这将返回 true如果他们是教练。

现在谈谈政策本身。几周前我刚开始使用 Pundit,但在您的情况下,我会这样做:
class GoalPolicy < ApplicationPolicy
class Scope < GoalPolicy
attr_reader :user, :scope

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

def resolve
@scope.where(user: @user)
end
end
end

然后您的(我假设 GoalsController 类和 index 方法)方法可以如下所示:
def index
policy_scope(Goal) # To answer your question, Goal is the scope
end

如果你想订购你也可以做
def index
policy_scope(Goal).order(:created_at)
end

我才意识到你半年前问过这个问题,但是,嘿!也许它会回答其他人的一些问题,也许我会得到一些关于我自己崭露头角的 Pundit 技能的反馈。

关于ruby-on-rails-4 - 如何使用权威范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21470576/

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