我最近开始在我的Rails应用程序中使用Pundit gem进行授权。在我的应用程序中,我有Company
的模型,每个Company
可以有多个Employees
,这是通过一个has many through关系完成的:
# company.rb
has_many :employees, dependent: :destroy
has_many :users, through: :employees
# employee.rb
belongs_to :company
# user ...
Employees
既可以发布,也可以不发布。在我列出公司员工的视图中,我只想为普通用户显示published
员工,但给定公司的其他员工应该看到该公司的所有员工。
在我的employees_controller#index
中,我有一个解决方案,目前看起来像这样:
def index
@employees = if current_user.is_employee?(@company)
@company.employees.all
else
@company.employees.select { |employee| employee.published == true }
end
end
这是可行的,但我试图了解如何利用Pundit
的作用域来实现同样的目标。
Pundit Scope的伪代码(这显然不起作用,但给出了我想要实现的示例):
# EmployeePolicy
class Scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
if user.is_employee?(...) # can't get company from scope
scope.all
else
scope.where(published: true)
end
end
end
我已经看到了一些使用连接来实现这一点的例子,但这似乎有点麻烦,有没有其他推荐的方法来实现这一点使用Pundit?
1条答案
按热度按时间nzkunb0c1#
用户#1可以看到公司#1的每个员工,只能看到公司#2的
published
:来自公司#2的用户看不到其他公司员工:
与授权无关的作用域应在控制器中应用: