我正在跟进我遇到before的问题。我能够让代码适用于三个角色,但我需要在混合中包含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
答案 0 :(得分: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
您必须更改查询才能同时拥有这两种角色。
答案 1 :(得分:0)
我想出了我必须做的事情。这是一个两步的过程。首先,我必须将角色更改为权威存储的数值,而不是字符串,因此role
将为0&amp; 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