Как проверить разрешение cancan на пользовательской странице ActiveAdmin?

У меня есть следующее Ability:

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

И он работает нормально, но я хочу проверить, есть ли у пользователя возможность управлять этим ActiveAdmin::Page на разных страницах. Итак, когда я использовал следующее:

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

Вернулся true для любой страницы, даже если она не существует!

4 ответа

Решение

Наконец, я нашел способ, он выглядит странно, потому что он использует register_page, но он работает:

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

Код

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

проверяет, может ли текущий пользователь управлять экземпляром ActiveAdmin::Page чья name Атрибут равен My Page. Это именно то условие, которое вы указали в своем файле способностей, и поэтому он всегда возвращает true,

Если вы хотите узнать, может ли пользователь получить доступ к определенной странице или нет, (я думаю, вы пытаетесь это сделать), вам следует спросить: "Могу ли я управлять этой страницей?" вместо "могу ли я управлять страницей с именем Моя страница?". В первом случае вы говорите о конкретной странице, а позже - о страницах с определенной характеристикой.

Чтобы спросить CanCan, может ли текущий пользователь получить доступ к определенной странице, просто спросите:

can? :manage, my_specific_page

где my_specific_page должен быть примером ActiveAdmin::Page,

После того, как я применил решение 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')

Я просто хотел поделиться тем, что я сделал для своего случая:

      # 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
Другие вопросы по тегам