展示视图的策略和案例运算符

时间:2015-09-29 18:27:29

标签: ruby-on-rails pundit

我的网站上有三种类型的用户:

  • 访客
  • 成员
  • VIP会员(用户模型中有vip属性)

体育预测发布在网站上,但用户没有相同的权利:

  • 访客只能看到过去的预测
  • 会员只能看到下一个小时内发生的预测
  • VIP会员可以查看所有预测。

我已经做了一个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

1 个答案:

答案 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