如何在 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
我有以下 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