Rails 4 - Pundit - scoped policy for index

后端 未结 3 1214
萌比男神i
萌比男神i 2021-01-14 17:24

I am trying to learn how to use Pundit with my Rails 4 app.

I have the following models:

class User < ActiveRecord::Base
  has_one :profile
  has_         


        
3条回答
  •  不思量自难忘°
    2021-01-14 18:28

    For others, I'm not sure if this is a solution that makes use of Pundit in the way it was intended, however it does generate the flows that I want, within the limits of my ability.

    Thank you to everyone who helped on this. I'm sure I've still got lots to learn about how to improve this, but for now, this is a solution that works.

    In summary - I now have two policies for 1 controller.

    Eoi Policy

    class EoiPolicy < ApplicationPolicy
    
      class Scope
    
        def initialize(user, scope)
          @user  = user
          @scope = scope
        end
    
        def resolve
          # selects all the EOI's for a given user
          @scope.where(user_id: @user.id)
        end
    
      end
    
      def index?
        true
      end
    

    Project Eoi Policy

    class ProjectEoiPolicy < ApplicationPolicy
      class Scope < Scope
        def resolve(project_id)
          project = Project.find(project_id)
          if project.owner?(@user)
            # if the user is the owner of the project, then get
            # all the eois
            project.eois
          else
            # select all the eois for the project
            # created by this user
            Eoi.for_user(@user.id).for_project(project_id)
          end
        end
      end
    
    end
    

    Eoi Controller index action

    class EoisController < ApplicationController
      before_action :get_project, except: [:index, :show]
      before_action :set_eoi, only: [:show, :edit, :update, :destroy]
    
    
      def index
        if params[:project_id]
          @eois = ProjectEoiPolicy::Scope.new(current_user, Eoi).resolve(params[:project_id])
        else
          @eois = policy_scope(Eoi)
        end
      end
    

提交回复
热议问题