Это распространенное заблуждение о том, как использовать CASL. Ни ability.can
, ни React's <Can>
не поддерживают такое поведение.
Вместо этого вам нужно понять, что такое имя субъекта и как CASL определяет имя субъекта на основе переданного в ability.can
объекта. Это объясняется в документации: https://stalniy.github.io/casl/abilities/2017/07/21/check-abilities.html#instance-checks
Также, пожалуйста, прочитайте https://github.com/stalniy/casl/issues/59, если информации в документации недостаточно.
Также проверьте пример приложения https://github.com/stalniy/casl-react-example (есть ссылка на codesanbox, чтобы вы могли быстро поиграть с ним). Приложение Todo использует аналогичный сценарий использования, который вам необходимо реализовать в своем приложении.
Наконец, я создал отдельное расширение https://github.com/stalniy/casl/issues/192,, чтобы другие получили сообщение об ошибке с объяснением неправильного использования и ссылку на документацию.
По сути, вам нужно определить собственную subjectName
функцию обнаружения и передать пользователя следующим образом:
<Can I="delete" this={{ role: 1, __typename: 'user' }}>
<p>Should be visible</p>
</Can>
Обновление : typename
должно быть частью экземпляра объекта для предотвращения столкновений (например, когда объекты выглядят одинаково или похожи, но имеют разные типы). Самый простой способ сохранить согласованность между типами объектов и их экземплярами - это использовать классы. Но есть и другие подходы, например, GraphQL имеет поле __typename
, которое сообщает клиенту тип объекта, полученный от сервера
Обновление 2 : по умолчанию Ability
запрещает делать все, поэтому ваш AbilityBuilder
не может содержать только запрещенные правила. Вам нужно хотя бы одно правило, которое позволяет что-то делать.