Cancan: разница между "управлять" и комбинацией "читать, создавать, обновлять и уничтожать"?
При попытке отладки использования cancan я обнаружил, что, если использовать следующее, я могу пройти мимо сообщения accessedied:
can :manage, Model
Когда я изменил его на следующее, мне отказали в доступе:
can :read, Model
can :create, Model
can :update, Model
can :destroy, Model
В чем заключается управление, заключающееся в том, что сочетание чтения, создания, обновления и уничтожения не выполняется?
Спасибо.
Ответы
Ответ 1
Вы можете определить пользовательские действия (когда вы определяете возможности пользователя для данной модели, вы не ограничены действиями 7 RESTful (создавать, обновлять, уничтожать и т.д.), вы можете создать свои собственные.) Если у вас есть управлять всеми, вы также сможете получить доступ к этим пользовательским действиям.
Ответ 2
По умолчанию CanCan сопоставляет :read
, :create
и т.д. с соответствующими действиями контроллера, например:
def default_alias_actions
{
:read => [:index, :show],
:create => [:new],
:update => [:edit],
}
end
Но, конечно, вы не ограничены тем, что у вас есть только эти действия в вашем контроллере, в конечном итоге действие контроллера может иметь любое имя. Точно так же вы не ограничены наличием всего :read, :create, :update, :detroy
в CanCan. Вы можете использовать любой символ для любого действия контроллера. Скажем, у вас есть действие на вашем контроллере под названием do_cool_things
, тогда вы можете использовать псевдоним любого символа для этого действия, которое будет использоваться CanCan, например:
alias_action :do_cool_things, :to => :coolify
Тогда вы сможете это сделать:
can :coolify, Neighborhood
Это означает, что текущий пользователь будет иметь доступ к методу :do_cool_things
NeighborhoodsController
. Однако, если вы использовали :manage
, вам не нужно было бы определять это отдельное действие, так как :manage
является catch-all. Итак, если вы сделали:
can :manage, Neighborhood
У текущего пользователя все равно был бы доступ к методу :do_cool_things
контроллера.
Итак, :manage
позволяет вам что-то делать, но :read, :create, :update and :destroy
- это всего лишь 4 из бесконечного числа действий CanCan, которые вы можете определить и сопоставить с любым выбранным вами действием контроллера.