2014-12-29 1 views
0

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

Проблема: у меня есть 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 
+0

В консоли вы можете рассказать мне, что у вас есть для 'User.where (role: 'user'). Count'? У вас есть некоторые пользователи с ролью «пользователь»? – Dougui

+0

Да, в моем db у меня 4 пользователя. Один для каждой роли. Так что это даст мне «1». Я также сделал то же самое 'User.where (role: 'business_user'). Count', и у меня есть 1. – AGirlThatCodes

ответ

0

Вы можете попытаться изменить Метод:

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 

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

+0

Спасибо! Для части 'scope.where', как вы сообщаете, я указываю обе роли:' user' и 'business_user' – AGirlThatCodes

+0

Я обновил свой ответ. – Dougui

+0

Спасибо! Я попытался использовать 'role ==" user "или role ==" business_user ", но мне не повезло. Мне пришлось переключить его на роль: 1. Я обновил свой вопрос. Я попытался использовать 'или' и '||' для середины, и мне не повезло. У вас есть рекомендации по нескольким параметрам 'where'? – AGirlThatCodes

0

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

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 

 Смежные вопросы

  • Нет связанных вопросов^_^