我的应用中只有管理界面,我使用AdminUser模型。管理员用户可以拥有不同的角色。
我想基于admin角色更改资源检索。我添加到我的ActiveAdmin寄存器块:
#app/admin/payments.rb
scope_to :current_admin_user
我希望我能写出类似的内容:
#app/models/admin_user.rb
def payments
case self.role
when role == 'manager'
Payments.where('...')
when role == '...'
end
end
但这不起作用,并始终显示所有资源。
我知道如何才能完成这项工作?
答案 0 :(得分:0)
最后,我使用了scoped_collection方法
ActiveAdmin.register Payment do
...
controller do
def scoped_collection
#roles which need to be scoped
if current_admin_user.role == 'accountant' or current_admin_user.role == 'manager'
resource_class.send(current_admin_user.role)
end
end
end
然后只需在模型中定义范围:
class Payment < ActiveRecord::Base
scope 'accountant', where('...')
scope 'manager', where('...')
...
end
答案 1 :(得分:0)
我找到了更好的解决方案。
授权适配器做得很好,并且不需要范围。例如,使用CanCan:
class Ability
include CanCan::Ability
def initialize(user)
#read/manage actions
if user.role == 'manager'
can :manage, Payment, :accessible_by_manager => true
elsif user.role == 'accountant'
can :read, Payment, :accessible_by_accountant => true
else
#can read all
can :read, Payment
end
end
end