Разница 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