Как понять методы load_resource и authorize_resource для gem cancancan?

Я использую камень cancancan в своем приложении для рельсов. Но мне не очень понятно значение load_and_authorize_resource метод. Я знаю, что это то же самое, что звонить load_resource а также authorize_resource,

load_resource создаст новый экземпляр модели или получит экземпляр params[:id]или набор экземпляров, то authorize_resource Метод будет использовать эти экземпляры для авторизации. Но если у меня уже есть Model.find(params[:id]) или же Model.new в каждом действии контроллера мне нужно добавить дозу load_resource метод?

Для некоторых действий (не RESTful), они не связаны с моделью, поэтому мне не нужно получать экземпляр для этой ситуации, authorize_resource как работать нормально?

Любая идея ценится! Заранее спасибо!

1 ответ

Решение

load_and_authorize_resource устанавливает before_filter для каждого действия загрузить ресурс в переменную экземпляра и авторизовать его автоматически. Так что это полезно для RESTful действий. Теперь, если у вас есть действия не RESTful в одном контроллере, который не может загрузить ресурс, вы можете сделать:

load_and_authorize_resource only: [:index, :show]

ИЛИ ЖЕ

skip_load_resource only: :new

Это пропустит before_filter за эти действия.

И если у вас есть Model.find(params[:id]) в контроллере вы можете удалить это или просто использовать:

authorize_resource

Вам не понадобится load_resource за эти действия. load_resource также делает то же самое, что вы сделали вручную. Это просто добавляет before_action на все действия и находит объект в соответствии с id,

И load_resource всегда предоставит вам переменную экземпляра с тем же именем Model, так что если вы используете что-то другое в своих представлениях для вашего объекта, то это тоже не поможет. Поэтому выбор варианта будет зависеть от вас и вашего кода.

Cancancan Wiki:

Начиная с CanCan 1.5 вы можете использовать skip_load_and_authorize_resource, skip_load_resource или же skip_authorize_resource методы, чтобы пропустить любое из примененных поведений и указать конкретные действия, как в фильтре перед.

Надеюсь это поможет.

Другие вопросы по тегам