Как проверить разрешение 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