专家范围,如何让会员只看到他们的帖子?

时间:2015-05-01 19:09:00

标签: ruby-on-rails ruby pundit

我正在为我的学校作业授权,这是一个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

谢谢。

1 个答案:

答案 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