Sha256: d5ab7bd5b6db3ad4fafc5060c01b03371313cfe8a5bc0fea6fcc3a75eb02de60

Contents?: true

Size: 1.64 KB

Versions: 3

Compression:

Stored size: 1.64 KB

Contents

module Merit
  # Sets up an app-wide after_filter, and inserts merit_action entries if
  # there are defined rules (for badges or points) for current
  # 'controller_path#action_name'
  module ControllerExtensions
    def self.included(base)
      base.after_filter do |controller|
        if rules_defined?
          log_merit_action
          Merit::Action.check_unprocessed if Merit.checks_on_each_request
        end
      end
    end

    private

    def log_merit_action
      Merit::Action.create(
        :user_id       => send(Merit.current_user_method).try(:id),
        :action_method => action_name,
        :action_value  => params[:value],
        :had_errors    => had_errors?,
        :target_model  => controller_path,
        :target_id     => target_id
      ).id
    end

    def rules_defined?
      action = "#{controller_path}\##{action_name}"
      AppBadgeRules[action].present? || AppPointRules[action].present?
    end

    def had_errors?
      target_object.respond_to?(:errors) && target_object.errors.try(:present?)
    end

    def target_object
      target_obj = instance_variable_get(:"@#{controller_name.singularize}")
      if target_obj.nil?
        Rails.logger.warn("[merit] No object found, maybe you need a '@#{controller_name.singularize}' variable in '#{controller_path}_controller'?")
      end
      target_obj
    end

    def target_id
      target_id = params[:id] || target_object.try(:id)
      # using friendly_id if id is nil or string but an object was found
      if target_object.present? && (target_id.nil? || !(target_id =~ /^[0-9]+$/))
        target_id = target_object.id
      end
      target_id
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
merit-1.3.0 lib/merit/controller_extensions.rb
merit-1.2.3 lib/merit/controller_extensions.rb
merit-1.2.2 lib/merit/controller_extensions.rb