Sha256: 2dcc9bd169ab994cf4311c9424fa3946f4ad6c346c3d026d281c032a7c1de827

Contents?: true

Size: 1.55 KB

Versions: 8

Compression:

Stored size: 1.55 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?
      RulesMatcher.new(controller_path, action_name).any_matching?
    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?
        str = '[merit] No object found, maybe you need a ' +
          "'@#{controller_name.singularize}' variable in " +
          "'#{controller_path}_controller'?"
        Rails.logger.warn str
      end
      target_obj
    end

    def target_id
      target_id = target_object.try(:id)
      # If target_id is nil
      # then use params[:id].
      if target_id.nil? && params[:id].to_s =~ /^[0-9]+$/
        target_id = params[:id]
      end
      target_id
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
merit-2.0.0 lib/merit/controller_extensions.rb
merit-1.9.0 lib/merit/controller_extensions.rb
merit-1.8.0 lib/merit/controller_extensions.rb
merit-1.7.1 lib/merit/controller_extensions.rb
merit-1.7.0 lib/merit/controller_extensions.rb
merit-1.6.2 lib/merit/controller_extensions.rb
merit-1.6.1 lib/merit/controller_extensions.rb
merit-1.6.0 lib/merit/controller_extensions.rb