我的网站上有三种类型的用户:
体育预测发布在网站上,但用户没有相同的权利:
我已经做了一个PredictionPolicy来定义谁可以看到预测模型的展示视图。
我认为我需要使用case运算符列出不同的场景,但我无法弄清楚如何。
这是我开始写的(不起作用):
def show?
x = @record.start_time - Time.now
case x
when -1.0/0 .. 0
User.all
when 0 .. 3600
user
when -1.0/0 .. +1.0/0
user.gold
end
end
end
您对解决方案有任何想法吗?
非常感谢
class PredictionPolicy < ApplicationPolicy
def show?
x = @record.start_time - Time.now
case x
when -1.0/0 .. 0
User.all
when 0 .. 3600
user
when -1.0/0 .. +1.0/0
user.vip
end
end
def create?
user.vip
end
def update?
user.team
end
def destroy?
user.team
end
def user_feed?
user.vip
end
def upvote?
user.vip
end
class Scope < Scope
def resolve
if user
if user.vip
scope.all
else
scope.where(status: [:won, :lost, :void])
end
else
scope.where(status: [:won, :lost, :void])
end
end
end
end
答案 0 :(得分:1)
您举例说明使用scopes。
您应该在Scope
下定义名为PredictionPolicy
的子类。实现应该如下所示:
class PredictionPolicy
# In this class we define which user can
# see which preditions.
class Scope
attr_reader :user, :scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
if user.blank? # guest
scope.where('start_time < ? AND status IN (?)', Time.now, [:won, :lost, :void])
elsif user.vip
scope.all
else
scope.where('start_time < ? AND status IN (?)', Time.now + 1.hour, [:won, :lost, :void])
end
end
end
end
定义了策略后,您可以在控制器中使用它:
def index
@predictions = policy_scope(Prediction)
end