module OpenStax::Utilities::DelegateAccessControl

Public Instance Methods

delegate_access_control(options={}) click to toggle source

Adds code to an ActiveRecord object to delegate its access control methods to another object. @example Model is ordered globally using a ‘number’ field

class MyModel < ActiveRecord::Base
  belongs_to :another
  delegate_access_control to: :another

@param :to The relationship to which the access control methods should

be delegated.

@param :include_sort If true, a “can_be_sorted_by?” method will be included

(Default: false)
# File lib/openstax/utilities/delegate_access_control.rb, line 20
      def delegate_access_control(options={})
        configuration = {include_sort: false}
        configuration.update(options) if options.is_a?(Hash)

        raise IllegalArgument, "A :to option must be provided" if configuration[:to].blank?
        
        configuration[:to] = configuration[:to].to_s

        class_eval <<-EOV
          delegate :can_be_read_by?, 
                   :can_be_updated_by?, 
                   to: :#{configuration[:to]}

          # Delegating creation and destroying of this contained object means you can
          # update the containing object
          
          alias_method :can_be_created_by?, :can_be_updated_by?
          alias_method :can_be_destroyed_by?, :can_be_updated_by?

          if #{configuration[:include_sort]}
            alias_method :can_be_sorted_by?, :can_be_updated_by?            
          end
        EOV

      end
delegate_access_control_to(relation, options = {}) click to toggle source

Convenience method for delegate_access_control

# File lib/openstax/utilities/delegate_access_control.rb, line 47
def delegate_access_control_to(relation, options = {})
  delegate_access_control options.merge(to: relation)
end