This library borrows functionality from CanCan(Can) and adds it to Pundit.
can?
andcannot?
view helpersload_resource
,authorize_resource
,load_and_authorize_resource
andskip_authorization
controller filters
The design intentions were:
- To ease the transition from CanCanCan to Pundit.
- To reduce boilerplate code in controller methods.
- To keep things simple and intentionally avoid dealing with edge cases or endless magical options you need to memorize.
Add to your Gemfile:
gem 'pundit_extra'
Add to your ApplicationController
:
class ApplicationController < ActionController::Base
include Pundit::Authorization
include PunditExtra
end
You can use the convenience methods can?
and cannot?
in any controller
and view.
if can? :assign, @task
is the same as Pundit'spolicy(@task).assign?
if can? :index, Task
is the same as Pundit'spolicy(Task).index?
if cannot? :assign, @task
is the opposite ofcan?
You can add these to your controllers to automatically load the resource and/or authorize it.
class TasksController < ApplicationController
before_action :authenticate_user!
load_resource except: [:index, :create]
authorize_resource except: [:create]
end
The load_resource
filter will create the appropriate instance variable
based on the current action.
The authorize_resource
filter will call Pundit's authorize @model
in each
action.
You can use except: :action
, or only: :action
to limit the filter to a
given action or an array of actions.
Example:
class TasksController < ApplicationController
before_action :authenticate_user!
load_resource except: [:edit, :complete]
authorize_resource except: :index
def index
# this happens automatically
# @tasks = policy_scope(Task)
end
def show
# this happens automatically
# @task = Task.find params[:id]
# authorize @task
end
def new
# this happens automatically
# @task = Task.new
# authorize @task
end
def create
# this happens automatically
# @task = Task.new task_params
# authorize @task
end
end
In addition, you can use:
load_and_authorize_resource
which is a combination shortcut forload_resource
andauthorize_resource
skip_authorization
which sendsskip_authorization
andskip_policy_scope
to Pundit for all (or the specified) actions.
Thanks for building awesome stuff.