Sha256: ea2cfb529614e8d01c6bac66b6f33f836e5e1e7caed40a6a66c468238143714c

Contents?: true

Size: 1.53 KB

Versions: 2

Compression:

Stored size: 1.53 KB

Contents

require "merit/models/#{Merit.orm}/merit_action"

class MeritAction
  # Check rules defined for a merit_action
  def check_rules(defined_rules)
    action_name = "#{target_model}\##{action_method}"

    unless had_errors
      # Check Badge rules
      if defined_rules[action_name].present?
        defined_rules[action_name].each do |rule|
          rule.grant_or_delete_badge(self)
        end
      end

      # Check Point rules
      actions_to_point = MeritPointRules.new.actions_to_point
      if actions_to_point[action_name].present?
        point_rule = actions_to_point[action_name]
        point_rule[:to].each do |to|
          if to == :action_user
            if !(target = User.find_by_id(user_id))
              Rails.logger.warn "[merit] no user found to grant points"
              return
            end
          else
            begin
              target = target_object.send(to)
            rescue NoMethodError
              Rails.logger.warn "[merit] No target_object found on check_rules."
              return
            end
          end
          target.update_attribute(:points, target.points + point_rule[:score])
        end
      end
    end

    processed!
  end

  # Action's target object
  def target_object(model_name = nil)
    # Grab custom model_name from Rule, or target_model from MeritAction triggered
    klass = model_name || target_model
    klass.singularize.camelize.constantize.find_by_id(target_id)
  end

  # Mark merit_action as processed
  def processed!
    self.update_attribute :processed, true
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
merit-0.4.2 app/models/merit_action.rb
merit-0.4.1 app/models/merit_action.rb