我刚刚从 CanCan 切换到 Pundit。我不确定几件事,以及如何最好地使用 Pundit。
例如:
如果您有一个可以有多个父对象的资源,例如,假设一个目标属于学生和教师。因此,一个学生可以有很多目标,而一个教师可以有很多目标。在控制器索引操作中,您可能会这样做:
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)