From 4fc13620eedb7a9d3f30076fac0212ab4cbe90f1 Mon Sep 17 00:00:00 2001 From: Jason Daly Date: Fri, 30 Nov 2012 10:21:46 -0500 Subject: [PATCH] Adds support for `policy_class` model instance/class for custom Policy --- lib/pundit/policy_finder.rb | 6 +++++- spec/pundit_spec.rb | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/pundit/policy_finder.rb b/lib/pundit/policy_finder.rb index 8733f7e..52d8f07 100644 --- a/lib/pundit/policy_finder.rb +++ b/lib/pundit/policy_finder.rb @@ -7,7 +7,11 @@ module Pundit end def name - if object.respond_to?(:model_name) + if object.respond_to?(:policy_class) + object.policy_class.name.gsub(/Policy$/, '') + elsif object.class.respond_to?(:policy_class) + object.class.policy_class.name.gsub(/Policy$/, '') + elsif object.respond_to?(:model_name) object.model_name.to_s elsif object.class.respond_to?(:model_name) object.class.model_name.to_s diff --git a/spec/pundit_spec.rb b/spec/pundit_spec.rb index a3b907f..8977093 100644 --- a/spec/pundit_spec.rb +++ b/spec/pundit_spec.rb @@ -34,12 +34,21 @@ class Comment; extend ActiveModel::Naming; end class Article; end +class BlogPolicy < Struct.new(:user, :blog); end +class Blog; end +class ArtificialBlog < Blog + def self.policy_class + BlogPolicy + end +end + describe Pundit do let(:user) { stub } let(:post) { Post.new(user) } let(:comment) { Comment.new } let(:article) { Article.new } let(:controller) { stub(:current_user => user, :params => { :action => "update" }).tap { |c| c.extend(Pundit) } } + let(:artificial_blog) { ArtificialBlog.new } describe ".policy_scope" do it "returns an instantiated policy scope given a plain model class" do @@ -76,6 +85,18 @@ describe Pundit do policy.post.should == post end + it "returns an instantiated policy given a plain model instance with policy_class class method set" do + policy = Pundit.policy(user, artificial_blog) + policy.user.should == user + policy.blog.should == artificial_blog + end + + it "returns an instantiated policy given a plain model class with policy_class class method set" do + policy = Pundit.policy(user, ArtificialBlog) + policy.user.should == user + policy.blog.should == ArtificialBlog + end + it "returns an instantiated policy given an active model instance" do policy = Pundit.policy(user, comment) policy.user.should == user