我正在为我的学校作业授权,这是一个Reddit克隆。我刚刚向Pundit Gem介绍了用户角色的授权,即管理员,主持人,会员和访客。
我必须这样做:
管理员和版主应该看到所有帖子,会员应该只看到自己的帖子,而访客应该看不到帖子。
以普通用户身份登录,您只能看到自己创建的帖子。
application_policy.rb
class ApplicationPolicy
attr_reader :user, :record
def initialize(user, record)
@user = user
@record = record
end
def index?
false
end
def show?
scope.where(:id => record.id).exists?
end
def create?
# Checks if user exists and is logged in
user.present?
end
def new?
create?
end
def update?
# Checks if user is logged in, the owner or admin
user.present? && (record.user == user || user.admin?)
end
def edit?
update?
end
def destroy?
update?
end
def scope
record.class
end
end
以下是我的工作内容:
这将检查用户是否在场,以及用户是主持人还是管理员,并且只授予他们查看帖子的权限。就像说明状态一样工作。
post_policy.rb
class PostPolicy < ApplicationPolicy
def index?
user.present? && (user.moderator? || user.admin?)
end
end
现在,如果我回头看看 application_policy.rb ,我可以在此处看到此行,&#34;检查用户是否已登录,所有者或管理员&#34;:
user.preset? && (record.user == user || user.admin?)
如果我尝试将此添加到我的索引授权中?我会继续得到一个
&#34; PostsController中的NoMethodError #index&#34;
class PostPolicy < ApplicationPolicy
def index?
user.present? && (user.moderator? || user.admin? || record.user == user)
end
end
谢谢。
答案 0 :(得分:5)
使用范围:https://github.com/elabs/pundit#scopes
在您的情况下,PostPolicy.rb应如下所示:
class PostPolicy < ApplicationPolicy
def index?
true
end
class Scope
attr_reader :user, :scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
if user.admin? || user.moderator?
scope.all
else
scope.where(user: user)
end
end
end
end