Sha256: 1e85b76f46684f3946a2d19ecc2f21df51d21dd0bdc9fa7f7b963f7236efba68

Contents?: true

Size: 1.87 KB

Versions: 2

Compression:

Stored size: 1.87 KB

Contents

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

class MeritAction
  attr_accessible :user_id, :action_method, :action_value, :had_errors,
    :target_model, :target_id, :processed, :log

  # Check rules defined for a merit_action
  def check_rules
    unless had_errors
      check_badge_rules
      check_point_rules
    end
    processed!
  end

  def check_badge_rules
    return if badge_rules.nil?
    badge_rules.each { |rule| rule.grant_or_delete_badge(self) }
  end

  def check_point_rules
    return if point_rules.nil?
    point_rules.each { |rule| rule.grant_points(self) }
  end

  def badge_rules
    @badge_rules ||= Merit::BadgeRules.new.defined_rules[action_str] || []
  end
  def point_rules
    @point_rules ||= Merit::PointRules.new.actions_to_point[action_str] || []
  end
  def action_str
    "#{target_model}\##{action_method}"
  end

  def target(to)
    @target ||= (to == :action_user) ? action_user : other_target(to)
  end

  def action_user
    begin
      Merit.user_model.find(user_id)
    rescue ActiveRecord::RecordNotFound
      Rails.logger.warn "[merit] no #{Merit.user_model} found with id #{user_id}"
      return
    end
  end

  def other_target(to)
    begin
      target_object.send(to)
    rescue NoMethodError
      Rails.logger.warn "[merit] NoMethodError on '#{target_object.inspect}.#{to}' (called from MeritAction#other_target)"
      return
    end
  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)
  rescue => e
    Rails.logger.warn "[merit] no target_object found: #{e}"
  end

  def log!(str)
    self.log = "#{self.log}#{str}|"
    self.save
  end

  # Mark merit_action as processed
  def processed!
    self.processed = true
    self.save
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
merit-1.0.1 app/models/merit_action.rb
merit-1.0.0 app/models/merit_action.rb