Search code examples
ruby-on-railspolicypundit

how can I read instance variable in rails controller action to pundit policy


controller show action

def show
   @batch = Batch.find(params[:id])
   @batch_id = @batch.id
   authorize @batch
end

pundit policy

def show?
puts @batch_id
    if !current_user.nil? && (current_user.role?('Student')) ||  (current_user.role?('Administrator')) || (current_user.role?('SupportSpecialist')) || (current_user.role?('Instructor'))
      true
    else
      false
    end
  end

I am getting nil when I puts @batch_id, how can I get that value in policy action


Solution

  • Your controller:

    def show
      @batch = Batch.find(params[:id])
      @batch_id = @batch.id
      authorize @batch
    end
    

    Your policy file might be:

    class BatchPolicy
      attr_reader :user, :record
     
      def initialize(user, record)
        @user = user
        @record = record
      end
         
      def show?
        true if record ...  // record will be equal @batch
      end  
    end
    

    If you want additional context, then you must know:

    Pundit strongly encourages you to model your application in such a way that the only context you need for authorization is a user object and a domain model that you want to check authorization for. If you find yourself needing more context than that, consider whether you are authorizing the right domain model, maybe another domain model (or a wrapper around multiple domain models) can provide the context you need.

    Pundit does not allow you to pass additional arguments to policies for precisely this reason.

    There you can learn about it from the horse's mouth.