Правильный способ использования pundit, когда доступ зависит от родительской модели

У меня есть модель клиента с has_many Contacts

Может ли пользователь создавать, обновлять или редактировать, зависит от Клиента, а не от Контакта, тогда как Уничтожение зависит от самого Контакта.

В классе ContactPolicy я могу просто проверить @contact.client, чтобы узнать, может ли пользователь иметь доступ, и это нормально.

Однако для метода List у меня есть не один контакт, а список @client.contacts, поэтому нет простого способа указать Pundit, что разрешать.

Я не уверен, как Pundit должен справиться с этим.

Обратите внимание, что мне не нужна область действия, так как это либо да, либо нет, в зависимости от записи клиента.


person giorgio    schedule 08.12.2014    source источник
comment
Я начал делать это, используя что-то вроде авторизации(@client.contacts.build), чтобы передать контакт, который позволит политике проверить клиента. Но кажется немного липким.   -  person giorgio    schedule 09.12.2014


Ответы (1)


Похоже, что поскольку доступ определяется клиентом, а не контактом, определение должно быть в ClientPolicy, а не в ContactPolicy.

Политики Pundit — это простые рубиновые классы, и нет правила, согласно которому методы возможностей должны соответствовать действиям контроллера. Судя по вашему описанию, искомая возможность заключается в том, может ли клиент 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
person numbers1311407    schedule 11.12.2014