CanCan中 :read 和 [:index, :show] 有什么区别?

10
根据所有文档,: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等页面,但是我可以访问posts_controller:index:show

如果这些操作行为不同,那么如何可能它们被“别名”了呢?

在我的尝试中,我还发现以下情况。将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个回答

16

我在GitHub上发布了这个问题,Ryan做出了回应:

无论是:index还是:show操作都指向:read操作。但是,当CanCan授权父资源时,它直接使用:read操作,这就是为什么你看到这种行为的原因。

我认为这之前曾经引起过混乱,所以我将更改内部行为,永远不再直接使用:read操作。我会将:parent资源改为使用:show,并且对于accessible_by默认情况下,我会使用:index而不是:read。感谢您让我注意到这一点。

https://github.com/ryanb/cancan/issues/302#comment_863142


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接