Как понять методы 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
методы, чтобы пропустить любое из примененных поведений и указать конкретные действия, как в фильтре перед.
Надеюсь это поможет.