当访问取决于父模型时使用 Pundit 的正确方法

gio*_*gio 2 ruby-on-rails pundit

我有一个客户端模型,其中有_many 联系人

用户是否可以创建、更新或编辑取决于客户端而不是联系人,而销毁取决于联系人本身。

在 ContactPolicy 类中,我可以简单地检查 @contact.client 以查看用户是否可以访问,这很好。

但是,对于 List 方法,我没有一个联系人,而是一个 @client.contacts 列表,因此没有简单的方法可以告诉 Pundit 允许什么。

我不确定 Pundit 应该如何处理这个问题。

请注意,我不想要范围,因为它是是或否取决于客户记录

num*_*407 5

看来,由于访问是由客户端和决定接触,判断应该是在ClientPolicy没有ContactPolicy

Pundit 策略是简单的 ruby​​ 类,并没有规定能力方法需要对应于控制器操作。根据您的描述,听起来您正在寻找的能力是客户是否可以list_contacts?。所以只需编写该功能并在操作中使用它而不是默认值index?

class ContactsController
  def index
    # assuming you've determined the parent `@client` somehow
    authorize @client, :list_contacts?
    # ...
  end
end

class ClientPolicy
  def list_contacts?
    # your capability logic here
  end
end
Run Code Online (Sandbox Code Playgroud)