dynamically detect which model adapter to use given a class
This commit is contained in:
@@ -7,6 +7,7 @@ require 'cancan/query'
|
||||
require 'cancan/inherited_resource'
|
||||
|
||||
require 'cancan/model_adapters/abstract_adapter'
|
||||
require 'cancan/model_adapters/default_adapter'
|
||||
require 'cancan/model_adapters/active_record_adapter' if defined? ActiveRecord
|
||||
require 'cancan/model_adapters/data_mapper_adapter' if defined? DataMapper
|
||||
require 'cancan/model_adapters/mongoid_adapter' if defined? Mongoid
|
||||
|
||||
@@ -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.
|
||||
#
|
||||
|
||||
7
lib/cancan/model_adapters/default_adapter.rb
Normal file
7
lib/cancan/model_adapters/default_adapter.rb
Normal file
@@ -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