Ограничить просмотр для различных ролей в Pundit

Я следую за проблемой, которая у меня была раньше. Я смог заставить код работать для трех ролей, но мне нужно включить 4 роли в микс.

Проблема: у меня есть 4 роли (пользователь, бизнес-пользователь, суперпользователь и администратор). Администраторы имеют доступ ко всему (пользовательский индекс). Суперпользователи могут видеть только пользователей и бизнес-пользователей (индекс пользователя).

Ошибка: у меня есть работающее приложение, которое позволяет администраторам иметь доступ ко всему, но мои суперпользователи могут видеть только пользователей (а не бизнес-пользователей). Я попытался переключиться в метод разрешения политики пользователя, для супер-пользователя, чтобы role: 'business_user' чтобы увидеть, сработало ли это. Ну, это не работает, и это только показывает мне users (не business_users). Это, вероятно, простая проблема с рубином, которую я пропускаю.

Политика пользователя

class UserPolicy
   attr_reader :current_user, :model

  def initialize(current_user, model)
    @current_user = current_user
    @user = model
  end

  class Scope
    attr_reader :user, :scope

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

    def resolve
      if user.admin?
        scope.all
      else user.super_user?
        scope.where(role: 'user')
      end
    end
  end

  def index?
    @current_user.admin? or @current_user.super_user?
  end
end

Пользовательский контроллер

class UsersController < ApplicationController
  before_filter :authenticate_user!
  after_action :verify_authorized

  def index
    @users = policy_scope(User)
    authorize @users
  end
[rest of the controller]

Модель пользователя

class User < ActiveRecord::Base
  enum role: [:user, :business_user, :super_user, :admin]
  [rest of model]
end

2 ответа

Можете ли вы попробовать изменить этот метод:

def resolve
  if user.admin?
    scope.all
  else user.super_user?
    scope.where(role: 'user')
  end
end

Этим:

def resolve
  if user.admin?
    scope.all
  else user.super_user?
    scope.where('role == "user" or role == "business_user"').all
  end
end

Вы должны изменить свой запрос, чтобы иметь обе роли.

Я понял, что я должен был сделать. Это был двухступенчатый процесс. Во-первых, мне пришлось изменить роль на числовое значение, которое pundit хранит как вместо строки, поэтому role будет 0 и 1. Во-вторых, я использовал массив для подачи их в параметр, чтобы он принимал несколько вариантов.

 class Scope
    attr_reader :user, :scope

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

    def resolve
      if user.admin?
        scope.all
      elsif user.super_user?
        scope.where(role: [1,0])
      else
        scope.none
      end
    end
  end
Другие вопросы по тегам