Rails 5 - 如何使用Pundit

时间:2016-10-04 09:04:21

标签: ruby-on-rails ruby pundit

我在尝试学习如何在我的rails应用程序中使用pundit的过程中,有两年的努力。我回来试图学习如何使用专家。

我已经制作了一个全新的rails 5 app并安装了专家。

我有用户资源,应用程序策略和用户策略。每个人都有:

用户控制器:

def index
    # @users = User.all
    @users = policy_scope(User)
  end

申请政策

class ApplicationPolicy
  attr_reader :user, :record

  def initialize(user, record)
    @user = user
    @record = record
  end

  def index?
    true
  end

  def show?
    scope.where(:id => record.id).exists?
  end

  def create?
    false
  end

  def new?
    create?
  end

  def update?
    false
  end

  def edit?
    update?
  end

  def destroy?
    false
  end

  def scope
    Pundit.policy_scope!(user, record.class)
  end

  class Scope
    attr_reader :user, :scope

    def initialize(user, scope)
      @user = user
      @scope = scope
    end

    def resolve
      scope
    end
  end
end

用户政策

class UserPolicy < ApplicationPolicy
  class Scope < Scope
    def resolve
      scope.where(user: user)
    end
  end


end

然后在我的用户索引中,我尝试按照权威宝石文档中的说明操作:

<% policy_scope(@users).each do |user| %>

我收到此错误:

PG::UndefinedColumn: ERROR:  column users.user does not exist
LINE 1: SELECT "users".* FROM "users" WHERE "users"."user" = '566119...
                                            ^
: SELECT "users".* FROM "users" WHERE "users"."user" = '566119d2-54d8-4ab2-b7c5-f17c80b517f3' AND "users"."user" = '566119d2-54d8-4ab2-b7c5-f17c80b517f3'

任何人都可以看到我是如何开始错误的吗?我还没有尝试以我想要的方式定义我的范围,但它现在还没有工作。

1 个答案:

答案 0 :(得分:1)

class UserPolicy < ApplicationPolicy
  class Scope < Scope
    def resolve
      scope.where(user: user)
    end
  end
end

scope.where表示User类(user.where),因为它在用户策略中。

用户值是当前用户,由应用程序范围继承。

您发布的范围示例我猜测您只想显示当前用户记录。然后您可以执行以下注释:

scope.where(id: user.try(:id))

另外,因为您已在控制器中定义了范围

def index
  # @users = User.all
  @users = policy_scope(User)
end

您不需要在视图中定义另一个。

 <% policy_scope(@users).each do |user| %>

它是一个或另一个。在视图中,您只需执行用户即可....