dynamically detect which model adapter to use given a class
This commit is contained in:
@@ -187,7 +187,8 @@ module CanCan
|
||||
end
|
||||
|
||||
def model_adapter(model_class, action)
|
||||
ModelAdapters::ActiveRecordAdapter.new(model_class, relevant_rules_for_query(action, model_class))
|
||||
adapter_class = ModelAdapters::AbstractAdapter.adapter_class(model_class)
|
||||
adapter_class.new(model_class, relevant_rules_for_query(action, model_class))
|
||||
end
|
||||
|
||||
# See ControllerAdditions#authorize! for documentation.
|
||||
|
||||
@@ -1,6 +1,20 @@
|
||||
module CanCan
|
||||
module ModelAdapters
|
||||
class AbstractAdapter
|
||||
def self.inherited(subclass)
|
||||
@subclasses ||= []
|
||||
@subclasses << subclass
|
||||
end
|
||||
|
||||
def self.adapter_class(model_class)
|
||||
@subclasses.detect { |subclass| subclass.for_class?(model_class) } || DefaultAdapter
|
||||
end
|
||||
|
||||
# Used to determine if the given adapter should be used for the passed in class.
|
||||
def self.for_class?(member_class)
|
||||
false # override in subclass
|
||||
end
|
||||
|
||||
def initialize(model_class, rules)
|
||||
@model_class = model_class
|
||||
@rules = rules
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
module CanCan
|
||||
module ModelAdapters
|
||||
class ActiveRecordAdapter < AbstractAdapter
|
||||
def self.for_class?(model_class)
|
||||
model_class <= ActiveRecord::Base
|
||||
end
|
||||
|
||||
# Returns conditions intended to be used inside a database query. Normally you will not call this
|
||||
# method directly, but instead go through ActiveRecordAdditions#accessible_by.
|
||||
#
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
module CanCan
|
||||
module ModelAdapters
|
||||
class DefaultAdapter < AbstractAdapter
|
||||
# This adapter is used when no matching adapter is found
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user