如何在 ActiveAdmin 自定义页面上检查 cancan 权限?

How to check cancan permission on ActiveAdmin custom page?

我有以下 Ability:

can :manage, ActiveAdmin::Page, name: 'My Page'

它工作正常,但我想检查用户是否有能力在不同的页面中管理此 ActiveAdmin::Page。所以,当我使用以下内容时:

can? :manage, ActiveAdmin::Page, name: 'My Page'

它为任何页面返回 true,即使它不存在!

代码

can? :manage, ActiveAdmin::Page, name: 'My Page'

检查当前用户是否可以管理 ActiveAdmin::Page 的实例,其 name 属性等于 My Page。这正是你在你的能力文件中陈述的条件,这就是为什么它总是 returns true.

如果您想知道用户是否可以访问特定页面(我认为您正在尝试这样做),您应该询问 "can I manage this page?" 而不是 "can I manage a page whose name is My Page?"。前者是指特定页面,后者是指具有某种特征的页面。

要询问CanCan当前用户是否可以访问特定页面,只需询问:

can? :manage, my_specific_page

其中 my_specific_page 需要是 ActiveAdmin::Page 的实例。

最后,我想出了一个办法,它看起来很奇怪,因为它使用了 register_page 但它确实有效:

can? :manage, (ActiveAdmin::register_page 'My Page')

我只是想分享我为我的案例所做的事情:

# ability.rb

can(:manage, ActiveAdmin::Page, name: 'Page Title')

并且在 ActiveAdmin 页面中:

action_item :specific_page, only: :show, if: proc { authorized?(:manage, controller.instance_variable_get(:@specific_page)) } do
  link_to 'Page Title', "/admin/..."
end
...  
controller do
  def show
    @specific_page = ActiveAdmin.application.namespaces[:admin].resources.select { |resource| resource.resource_label == 'Page Title' }.first
  end
end