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

6yoyoihd  于 2023-05-06  发布在  Ruby
关注(0)|答案(4)|浏览(111)

下面是Ability

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

而且它工作得很好,但我想检查用户是否有能力在不同的页面中管理这个ActiveAdmin::Page。因此,当我使用以下命令时:

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

404-页面不存在页面不存在!

j2cgzkjk

j2cgzkjk1#

密码

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

检查当前用户是否可以管理name属性等于 My PageActiveAdmin::Page示例。这正是你在能力文件中陈述的条件,这就是为什么它总是返回true
如果你想知道一个用户是否可以访问一个特定的页面(我认为你正在尝试这样做),你应该问“我可以管理这个页面吗?””而不是“我可以管理名称为 * 我的页面 * 的页面吗?在前者中,你谈论的是一个特定的页面,而在后者中,你谈论的是具有某种特征的页面。
为了询问CanCan当前用户是否可以访问特定页面,只需询问:

can? :manage, my_specific_page

其中my_specific_page需要是ActiveAdmin::Page的instance。

b0zn9rqh

b0zn9rqh2#

最后,我想出了一个方法,它看起来很奇怪,因为它使用了 register_page,但它正在工作:

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

yvgpqqbh3#

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

# 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
lf5gs5x2

lf5gs5x24#

在我应用register_page解决方案之后,菜单下拉列表扩展到了各个菜单链接。
这个GitHub问题让我来回答。https://github.com/activeadmin/activeadmin/issues/4783#issuecomment-479562966
我是这样解决的。

def find_custom_page(name)
   ActiveAdmin.application.namespaces[:admin].resources.find{|r| r.resource_name.name == name }
end

can? :manage, (find_custom_page 'MyPage')

相关问题