5

I've the following Ability:

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

And it is working fine, but I want to check if the user has the ability to manage this ActiveAdmin::Page in different pages. So, when I used the following:

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

It returned true for any page even if it does not exist!

Md. Farhan Memon
  • 6,055
  • 2
  • 11
  • 36
Mahmoud M. Abdel-Fattah
  • 1,479
  • 2
  • 16
  • 34

4 Answers4

8

The code

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

checks if the current user can manage an instance of ActiveAdmin::Page whose name attribute is equal to My Page. That is exactly the condition you stated in your abilities file, and that is why it always returns true.

In case you want to know if a user can or cannot access a specific page (which is what I think you are trying to do) you should ask "can I manage this page?" instead of "can I manage a page whose name is My Page?". In the former you are talking about a specific page, and in the later you are talking about pages with a certain characteristic.

In order to ask CanCan whether the current user can access a specific page, just ask:

can? :manage, my_specific_page

where my_specific_page needs to be an instance of ActiveAdmin::Page.

Bustikiller
  • 2,423
  • 2
  • 16
  • 34
0

Finally, I figured out a way, it looks weird because it uses register_page but it is working:

can? :manage, (ActiveAdmin::register_page 'My Page')
Mahmoud M. Abdel-Fattah
  • 1,479
  • 2
  • 16
  • 34
0

I just wanted to share what I did for my case:

# ability.rb

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

And in the ActiveAdmin page:

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
pamit
  • 326
  • 2
  • 10
0

After I applied register_page solution, the menu dropdowns extended to individual menu links.

This github issue leads me to answer. https://github.com/activeadmin/activeadmin/issues/4783#issuecomment-479562966

I solved like this.

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

can? :manage, (find_custom_page 'MyPage')