Skip to content

Commit 995bad0

Browse files
committed
Implement proper STI support in Rolify
1 parent 55261dc commit 995bad0

File tree

5 files changed

+22
-13
lines changed

5 files changed

+22
-13
lines changed

lib/rolify/adapters/active_record/role_adapter.rb

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ def where_strict(relation, args)
1212
wrap_conditions = relation.name != role_class.name
1313

1414
conditions = if args[:resource].is_a?(Class)
15-
{:resource_type => args[:resource].to_s, :resource_id => nil }
15+
{:resource_type => resource_base_class(args[:resource]), :resource_id => nil }
1616
elsif args[:resource].present?
17-
{:resource_type => args[:resource].class.name, :resource_id => args[:resource].id}
17+
{:resource_type => resource_base_class(args[:resource]), :resource_id => args[:resource].id}
1818
else
1919
{}
2020
end
@@ -27,7 +27,7 @@ def where_strict(relation, args)
2727

2828
def find_cached(relation, args)
2929
resource_id = (args[:resource].nil? || args[:resource].is_a?(Class) || args[:resource] == :any) ? nil : args[:resource].id
30-
resource_type = args[:resource].is_a?(Class) ? args[:resource].to_s : args[:resource].class.name
30+
resource_type = resource_base_class(args[:resource])
3131

3232
return relation.find_all { |role| role.name == args[:name].to_s } if args[:resource] == :any
3333

@@ -40,7 +40,7 @@ def find_cached(relation, args)
4040

4141
def find_cached_strict(relation, args)
4242
resource_id = (args[:resource].nil? || args[:resource].is_a?(Class)) ? nil : args[:resource].id
43-
resource_type = args[:resource].is_a?(Class) ? args[:resource].to_s : args[:resource].class.name
43+
resource_type = resource_base_class(args[:resource])
4444

4545
relation.find_all do |role|
4646
role.resource_id == resource_id && role.resource_type == resource_type && role.name == args[:name].to_s
@@ -57,7 +57,7 @@ def add(relation, role)
5757

5858
def remove(relation, role_name, resource = nil)
5959
cond = { :name => role_name }
60-
cond[:resource_type] = (resource.is_a?(Class) ? resource.to_s : resource.class.name) if resource
60+
cond[:resource_type] = resource_base_class(resource) if resource
6161
cond[:resource_id] = resource.id if resource && !resource.is_a?(Class)
6262
roles = relation.roles.where(cond)
6363
if roles
@@ -83,6 +83,11 @@ def all_except(user, excluded_obj)
8383
user.where.not(user.primary_key => excluded_obj)
8484
end
8585

86+
def resource_base_class(resource)
87+
resource_class = resource.is_a?(Class) ? resource : resource.class
88+
resource_class.superclass.abstract_class? ? resource_class.to_s : resource_class.superclass.to_s
89+
end
90+
8691
private
8792

8893
def build_conditions(relation, args)
@@ -110,10 +115,10 @@ def build_query(role, resource = nil)
110115
if resource
111116
query.insert(0, "(")
112117
query += " OR ((#{role_table}.name = ?) AND (#{role_table}.resource_type = ?) AND (#{role_table}.resource_id IS NULL))"
113-
values << role << (resource.is_a?(Class) ? resource.to_s : resource.class.name)
118+
values << role << resource_base_class(resource)
114119
if !resource.is_a? Class
115120
query += " OR ((#{role_table}.name = ?) AND (#{role_table}.resource_type = ?) AND (#{role_table}.resource_id = ?))"
116-
values << role << resource.class.name << resource.id
121+
values << role << resource_base_class(resource) << resource.id
117122
end
118123
query += ")"
119124
end

lib/rolify/adapters/mongoid/role_adapter.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@ def all_except(user, excluded_obj)
102102
user.not_in(_id: excluded_obj.to_a)
103103
end
104104

105+
def resource_base_class(resource)
106+
resource.is_a?(Class) ? resource.to_s : resource.class.name
107+
end
108+
105109
private
106110

107111
def build_conditions(relation, args)

lib/rolify/dynamic.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module Rolify
44
module Dynamic
55
def define_dynamic_method(role_name, resource)
6-
class_eval do
6+
class_eval do
77
define_method("is_#{role_name}?".to_sym) do
88
has_role?("#{role_name}")
99
end if !method_defined?("is_#{role_name}?".to_sym) && self.adapter.where_strict(self.role_class, name: role_name).exists?

lib/rolify/resource.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ def with_role(role_name, user = nil)
2020
user ? self.resource_adapter.in(resources, user, role_name) : resources
2121
end
2222
alias :with_roles :with_role
23-
alias :find_as :with_role
23+
alias :find_as :with_role
2424
alias :find_multiple_as :with_role
2525

2626

2727
def without_role(role_name, user = nil)
2828
self.resource_adapter.all_except(self, self.find_as(role_name, user))
2929
end
3030
alias :without_roles :without_role
31-
alias :except_as :without_role
32-
alias :except_multiple_as :without_role
31+
alias :except_as :without_role
32+
alias :except_multiple_as :without_role
3333

3434

3535

@@ -38,7 +38,7 @@ def applied_roles(children = true)
3838
end
3939

4040

41-
41+
4242
end
4343

4444
def applied_roles

lib/rolify/role.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def self.included(base)
1111

1212
def add_role(role_name, resource = nil)
1313
role = self.class.adapter.find_or_create_by(role_name.to_s,
14-
(resource.is_a?(Class) ? resource.to_s : resource.class.name if resource),
14+
(self.class.adapter.resource_base_class(resource) if resource),
1515
(resource.id if resource && !resource.is_a?(Class)))
1616

1717
if !roles.include?(role)

0 commit comments

Comments
 (0)