是否可以使用Can?在ActiveAdmin控制器中(使用cancancan gem)

问题描述 投票:0回答:1

can?实际上在AA中工作吗?使用AA 2.6.1以及Rails 6和Ruby 2.6.5。

[我在latest AA documentation和许多其他文章中看到,can?方法应该在AA资源控制器中可调用,例如

index do
  column :title, sortable: false
  column :secret_data if can? :manage, Post
end

但是,如果将这样的if语句添加到:index列中,则会出现错误。“未定义的方法可以吗?”为零:NilClass“

这是一个简单的上下文,应该适合初学者,但是我想做的事情有些复杂。

我有一个AdmixUser模型和一个Group模型,以及一个嵌套资源Grouprelationship,用于存储AdmixUser在Group中的角色。在Group#show页面上,有一个table_forgroup的关系,如下所示:

table_for resource.grouprelationships do
  column :action_test do |gr|
    para link_to "Edit Relationship", edit_admix_grouprelationship_path(gr.id)
 end
end

以及我的Ability.rb

    can :read, Grouprelationship, group_id: mygroups
    can :update, Grouprelationship do |gr|
      user_role=Grouprelationship.find_by(admix_user_id: user.id, group_id: gr.group_id).role
      return true if user_role==Grouprelationship::PI #PI can do anything
    end

这里的逻辑是,如果我在组中的角色是“ PI”,那么我一个人就能更新组中其他人的角色。

就AA而言,此逻辑工作正常。如果非PI用户遵循表中的link_to,则它肯定会执行Ability类中的块,并且控制器将闪烁一条通知,表明该操作未被授权。但是,最好不要先提供指向未授权页面的链接,这样会更清洁。如果我将link_to行更改为:

para link_to "Edit Relationship", edit_admix_grouprelationship_path(gr.id) if can? :update, gr

然后抛出相同的未定义方法错误。

很难在AA中找到有关can?方法的最新讨论。在较早的时候this link,似乎有必要用load_and_authorize_resource修改资源的控制器,但该方法在我的AA控制器中不存在。

所以最后一个问题是如何配置资源以便启用can?,否则我做错了什么?

可能会有一些复杂性,因为我使用的是自定义用户模型“ admix_user”和名称空间“ admix”,但由于CanCanCan授权在除上述can?的上述用法之外的每个AA上下文中都有效,因此我似乎已经正确设置了此设置。 >

可以吗?实际在AA工作?使用AA 2.6.1,Rails 6和Ruby 2.6.5。我在最新的AA文档和许多其他文章中看到可以吗?方法应可在AA资源中调用...

activeadmin ruby-on-rails-6 cancancan
1个回答
0
投票

阅读AA文档,正确的用法不是can?,而是authorized?。即在我的控制器中,当我使用

© www.soinside.com 2019 - 2024. All rights reserved.