如果授权取决于实例变量,我如何使用 Pundit 授权控制器操作?

How do I authorize a controller action with Pundit if authorization depends on an instance variable?

我有一个 wedding class,其中有很多 organizers,并且资源是嵌套的,因此,要查看活动的组织者,我必须访问:/events/23/organizers

组织者的索引控制器是这样的:

Class OrganizersController < ApplicationController
  def index
    @wedding = Wedding.find(params[:wedding_id]
    @organizers = Organizer.where(wedding: @wedding)
  end
end

问题是,我如何允许专家授权 OrganizersController 的索引操作,并且仅当对于实例中的 @wedding@wedding.organizers.find(user: current_user).present??

它们是两个完全不同的模型,一个的授权取决于另一个。

我假设 Organizer 属于 Wedding,在这种情况下你应该有 @organizers = @wedding.organizers

但是,要回答有关专家授权的问题,您应该查看 scopes。从这里,您可以 return 当前用户作为组织者所属的婚礼。

你还应该有一个关系,当前用户作为组织者有很多婚礼。所以,你会得到类似 current_user.weddings 的东西,因为用户在 organizer.

期间有很多婚礼

您可以在组织控制器的索引操作中添加 authorize @wedding 吗?猜测您的身份验证已经设置为检查用户是否应该有权访问婚礼。

我最接近的答案是 this

The way I usually do it, is to add a list_organizers? predicate to the wedding policy and then:

authorize(@wedding, :list_organizers?)

It's not terribly elegant though.

如果您找到更好的方法,请回答,我会采纳为更好的方法。