Как передать простой объект в разрешения CASL (React) - PullRequest
0 голосов
/ 18 мая 2019

Как передать условие компоненту <Can />, который соответствует условию в объекте способности.

AbilityBuilder, который предоставляет разрешения моему приложению:

AbilityBuilder.define((can, cannot) => {
  cannot('delete', 'user', { role: 2 }) // <- 2
});

Компонент, который должен визуализировать абзац.

<Can I="delete" a="user" of={{ role: 1 }}>
    <p>Should be visible</p> 
</Can>

Как я могу передать объект вместо экземпляра класса?Я не нашел никакой информации об этом: (

1 Ответ

1 голос
/ 18 мая 2019

Это распространенное заблуждение о том, как использовать 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 не может содержать только запрещенные правила. Вам нужно хотя бы одно правило, которое позволяет что-то делать.

...