Разница CanCan между: read и [: index,: show]?
В соответствии со всей документацией действие :read
сглаживается как с :index
, так и :show
:
alias_action :index, show, :to => :read
Однако рассмотрим следующий сценарий с вложенными ресурсами:
resources :posts
resources :comments
end
Если я определяю такие способности:
# ability.rb
can :read, Post
can :show, Comment
# comments_controller.rb
load_and_authorize_resource :organization, :find_by => :permalink
load_and_authorize_resource :membership, :through => :organization
все работает так, как ожидалось. Однако, если я изменил действие :read
на [: index,: show]:
# ability.rb
can [:index, :show], Post
can :show, Comment
# comments_controller.rb
load_and_authorize_resource :organization, :find_by => :permalink
load_and_authorize_resource :membership, :through => :organization
Я несанкционирован для доступа к /posts/:post_id/comments
, /posts/:post_id/comments/:id
и т.д. Тем не менее, я все же могу получить доступ к :index
и :show
для posts_controller
.
Как возможно, что эти действия "сглажены", если они ведут себя по-другому?
В моей игре я также натолкнулся на следующее. Изменение load_and_authorize_resource
на следующий разрешенный доступ:
# ability.rb
can [:index, :show], Post
can :show, Comment
# comments_controller.rb
load__resource :organization, :find_by => :permalink
load_and_authorize_resource :membership, :through => :organization
Может кто-нибудь объяснить, что здесь происходит?
Ответы
Ответ 1
Я разместил это как вопрос о GitHub. Райан ответил следующим образом:
Оба действия :index
и :show
укажите на действие :read
. Но когда CanCan разрешает родительский ресурс использует непосредственно действие :read
, которое почему вы видите это поведение.
Я думаю, что это вызвало путаницу раньше, поэтому я изменю внутренний поведение, чтобы никогда не использовать :read
прямое действие. Вместо Ресурс :parent
Я изменю его на используйте :show
и для accessible_by
default Я буду использовать :index
вместо :read
. благодаря для привлечения внимания к этому вопросу.
https://github.com/ryanb/cancan/issues/302#comment_863142