0

我正在跟进我之前遇到的问题。我能够让代码为三个角色工作,但我需要在组合中包含 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
4

2 回答 2

0

我知道我必须做什么。这是一个两步的过程。首先,我必须将角色更改为权威人士存储它的数值而不是字符串,因此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
于 2014-12-29T20:21:46.663 回答
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

您必须更改您的查询以同时拥有这两个角色。

于 2014-12-29T19:19:15.407 回答