我现在正在做一个小型的 Rails 项目。我正在使用 Pundit 来授权控制器操作和内容。现在的工作是使用 Pundit 进行索引操作,并policy_scope
在我的控制器中使用 Pundit 来获取用户可以看到的项目。
用户可以通过 3 种方式查看项目: - 他是所有者 - 他被邀请 - 项目是公开的
我现在尝试了几种解决方案,但最终做了以下事情:
scope :public_or_involved, -> (user) {
joins('LEFT JOIN invitations ON invitations.project_id = projects.id').
where('projects.is_public = TRUE OR projects.owner_id = ? OR invitations.reciever_id = ?', user.id, user.id)
}
这是我得到类似“public_or_involved”的唯一方法来处理 project_policy.rb 中的以下权威范围:
class Scope
attr_reader :user, :scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
scope.public_or_involved(user)
end
end
所以我的问题,最后:
有没有一种优雅的方式来做我现在正在做的事情? 感觉很丑,不像铁轨!