sealink/right_on

View on GitHub
lib/right_on/rule.rb

Summary

Maintainability
A
0 mins
Test Coverage
module RightOn
  class Rule
    def self.rule_for(right)
      self.new(right).call
    end

    def initialize(right)
      @right = right
    end

    def call
      validate!

      CanCan::Rule.new(can?, action, subject, conditions, nil)
    end

    private

    def validate!
      fail RightOn::Error, 'must specify an action' unless @right.action.present?
    end

    def can?
      @right.can
    end

    def action
      @right.action.to_sym
    end

    def subject
      model_class || @right.subject
    end

    def conditions
      model_class ? @right.conditions : nil
    end

    def model_class
      return nil unless @right.subject.present?

      begin
        model_class = self.class.const_get(@right.subject)
      rescue NameError
        model_class = Class
      end

      return model_class if model_class.ancestors.include?(ActiveRecord::Base)
    end
  end
end