12 Gems of Christmas #9 – pundit
2012-12-04
When it comes to authorization, Ryan Bates’ CanCan gem is the 800 lb gorilla that most Rails apps use. pundit is the latest gem from Jonas Nicklas (author of Carrierwave and Capybara) with some interesting ideas that you might like. Pundit uses code conventions along with a plain old Ruby API to make for a very simple implementation. First, write a policy for each type of model you wish to authorize:
class PostPolicy < Struct.new(:user, :post)
def create?
user.admin? or not post.published?
end
end
Then in the corresponding controller, use authorize
to verify permissions:
def create
@post = Post.new(params[:post])
authorize @post
if @post.save
redirect_to @post
else
render :new
end
end
Pundit assumes the current user is available via current_user
within the controller and passes it to your policy along with the model instance.
There’s a few more features to be discovered over on the GitHub README but the entire library is less than 200 lines of code; it’s beautifully succinct.
Next up, I’ll cover a handy little gem for creating nice PDF files without having to dive into the complexities of the PDF format.