Я не думаю, что вы можете сделать это с CanCan прямо из коробки.Это действительно только дает возможность сказать, может ли пользователь что-то делать или нет.
Интересно, можно ли использовать это нетипичным способом, хотя и определяя несколько подклассов Ability
для проверки разрешений.Реализация по умолчанию состоит в том, чтобы создать экземпляр Ability
для текущего пользователя и опросить его.
Если вы создали коллекцию подклассов Ability
, чтобы отразить различные виды доступа, которые вы хотите проверить, вы можете затемспросите каждого по очереди, может ли пользователь что-то сделать или нет.Первый, кто отказал бы в разрешении, затем использовался бы для генерации вашего конкретного сообщения об ошибке.
Вам действительно нужно было бы создать всеобъемлющий класс способностей, чтобы объединить коллекцию Ability
подклассов и создать ее в current_ability
метод, который CanCan предоставляет, чтобы вернуть возможность для текущего пользователя.Затем, предоставляя те же самые методы can?
и cannot?
для вашего класса, он будет работать так же, как обычные способности, но вы сможете расширить его, чтобы обеспечить метод why?
, который мог бы определить, какой Ability
подкласс отклонил разрешение и в результате сгенерировал другое сообщение об ошибке.
На самом деле, вам нужно было бы также предоставить новую реализацию authorize!
, чтобы она возвращала нужное сообщение об ошибке.
Извините, длинный ответ, который в основном - вам придется сделать это самостоятельно.