我正在对组执行一种权限功能,每个组都有不同的权限访问ActiveAdmin页面。但有些页面的名称与其型号不同。。。
ActiveAdmin.register Member, as: 'Customer' do # rubocop:disable Metrics/BlockLength
actions :all, except: %w[new create destroy]
filter :email
end
在我的授权适配器中,我试图实现以下功能:
class AdminAuthorization < ActiveAdmin::AuthorizationAdapter
def authorized?(action, subject = nil)
# This one is really a page, not linked to model.
return true if subject.name == 'Dashboard'
# this will be done more dynamically later with tables
return false if subject.name == 'Customer' && !current_user.admin?
end
end
";name";方法适用于Pages,但不适用于Resources。有没有类似的方法可以在这里获得"客户"而不是"会员"?我如何知道资源是页面还是资源?
我使用bundle info activeadmin
来定位机器上的gem源,读取~/.rvm/gems/ruby-2.6.5@sfp-rails-6/gems/activeadmin-2.13.1/lib/active_admin/authorization_adapter
的源时,我注意到resource
有一个attr_reader
。
然后我在授权的入口处丢了一个byebug
def authorized?(action, subject = nil)
byebug
# ...
end
并使用pp resource.methods
转储该资源具有的methods
(在请求自定义活动管理页面后(。这给出了一个包含许多方法的巨大数组,但我看到了许多resource_
方法,所以我转储了这些:
resource.methods.select{|m|m=~/resource/}
产生
[
:find_resource,
:resource_name_extension,
:resource_columns,
:resource_attributes,
:resource_class,
:resource_column_names,
:resource_table_name,
:resource_quoted_column_name,
:resource_class_name,
:resource_label,
:resource_name,
:plural_resource_label,
:resources_configuration
]
您可以使用以下条款:
class AdminAuthorization < ActiveAdmin::AuthorizationAdapter
def authorized?(action, subject = nil)
return true if resource.resource_name.name == 'Customer'
end
end
还有:
resource.resources_configuration
我鼓励你检查一下。我还没有找到查询resource
是否为Page
或ActiveRecord
模型的通用方法。