Skip to content

Instantly share code, notes, and snippets.

class FoosController < ApplicationController
include Pundit
#...
# record policy
def set_record_policy
policy(PolicyContext.new(record, current_user)
end
# scope policy
class PolicyContext
attr_reader :record
def initialize(record, user)
@record = record
@user = user
end
def policy_class
"#{@user.role}FooPolicy".classify
class AdminFooPolicy < ApplicationPolicy
class Scope
attr_reader :user, :scope
def initialize(user, context)
@user = user
@scope = context.record
end
def resolve
class FooPolicy < ApplicationPolicy
#...
class Scope
#...
def resolve
if user.roles.include?("admin")
scope.not_cancelled
elsif user.roles.include?("official")
scope.not_draft
elsif user.roles.include?("provider")
@pedrosmmoreira
pedrosmmoreira / final_controller_calls.rb
Last active January 21, 2016 06:40
Dynamic Pundit Policies per user type
class FoosController < ApplicationController
include Pundit
#...
# record policy
def set_record_policy
policy(PolicyContext.new(record, current_user)
end
# scope policy
require 'spec_helper'
describe 'GET /v1/projects' do
it 'returns a list of all projects' do
projects = create_list :project, 2
get "/v1/projects"
expect(response_json).to eq(
'projects' => [{