Мне нужно переопределить область видимости, но я не знаю, как - PullRequest
0 голосов
/ 11 января 2019

У меня вопрос по Пандиту.

В основном я хочу сделать это:

class Scope < Scope
  def resolve
   scope.select {|employee| (employee.restaurant == @restaurant) && employee.actif}
  end
end

но я не знаю, как я могу передать @restaurant из моего контроллера в мою политику.

вот мой метод индекса:

def index
  @restaurant = Restaurant.find(params[:restaurant_id])
  @employees = policy_scope(Employee)
end

Я пытался сделать это:

class Scope
    attr_reader :user, :scope, :record

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

    def resolve
      if is_user_manager_or_gerant_or_admin?
        scope.select {|employee| (employee.restaurant == record) && employee.actif}
      end
    end

    private

    def is_user_manager_or_gerant_or_admin?
    user.admin || (user.accreditations.select {|a| a.restaurant == record})[0].role == ("Gérant" || "Manager")
   end
end

с помощью этого метода индекса:

def index
  @restaurant = Restaurant.find(params[:restaurant_id])
  @employees = EmployeePolicy::Scope.new(current_user, Employee, @restaurant).resolve
end

Но я получаю эту ошибку:

Pundit :: PolicyScopingNotPerformedError в EmployeesController # index

1 Ответ

0 голосов
/ 12 января 2019

Из вашего вопроса непонятно, куда вы помещаете класс Scope, но он должен находиться внутри вашего класса EmployeePolicy. Вы передадите параметр так же, как и любой другой класс.

Я думаю, что вы получаете эту ошибку, потому что вы непреднамеренно конвертируете свою область ActiveRecord в массив, используя метод #select. Попробуйте вместо этого использовать методы ActiveRecord.

# app/policies/employee_policy.rb

class EmployeePolicy < ApplicationPolicy
  class Scope
    attr_reader :user, :scope, :restaurant

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

    def resolve
      if is_user_manager_or_gerant_or_admin?
        scope.where(restaurant: restaurant).where.not(employee.actif: nil)
      end
    end

    ...

  end
end

Ваш метод индекса должен выглядеть следующим образом:

# app/controllers/employees_controller.rb

class EmployeesController < ApplicationController
  def index
    @restaurant = Restaurant.find(params[:restaurant_id])
    @employees = EmployeePolicy::Scope.new(current_user, Employee, @restaurant).resolve
  end
end

Если у вас все еще проблемы, то этот пост может быть поучительным.

...