【问题标题】:Rails 5 - how to use PunditRails 5 - 如何使用 Pundit
【发布时间】:2016-10-04 09:04:21
【问题描述】:

两年来,我一直在努力学习如何在我的 rails 应用程序中使用 pundit。我回来尝试学习如何使用 pundit。

我制作了一个全新的 rails 5 应用并安装了 pundit。

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

用户控制器:

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

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

<% 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'

谁能看出我是怎么开始走错路的?我什至还没有尝试以我想要的方式定义我的范围,但它目前不起作用。

【问题讨论】:

  • 也许你的意思是scope.where(id: user.try(:id))

标签: ruby-on-rails ruby pundit


【解决方案1】:
class UserPolicy < ApplicationPolicy
  class Scope < Scope
    def resolve
      scope.where(user: user)
    end
  end
end

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

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

您发布的范围示例我猜您只想显示当前用户记录。然后您可以按照上面的评论执行以下操作:

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

也是因为你在控制器中定义了一个作用域

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

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

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

这是一个或另一个。在视图中你可以简单地做 users.each 做....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多