Module: Badgeable::Award

Included in:
Dsl
Defined in:
lib/badgeable/award.rb

Instance Method Summary collapse

Instance Method Details

#badge(name, options = {}, &block) ⇒ Object

Configure a class to automatically award badges after creation. Assign a badge name and a block with configuration directives.

Valid directives:

thing (Required) a class constant in this namespace that awards the badge. subject (Optional, default = :user) a symbol that references the object to which the badge is awarded. This should be a related object that includes Badgeable, and will usually have referenced_in :thing, belongs_to :thing etc. count (Optional, default = 1) either an integer threshold value of :things related to :subject, or a block. If a block is given, the created instance of :thing is passed as the first block argument, and the block must return return true for the badge to be awarded. conditions (Optional) provide a block; if your block returns returns true, the badge is awarded. The first block argument is the created instance of :thing. The conditions directive may be called any number of times, and all conditions and the count block must return true. Also note that the conditions and count directives are evaluated separately.

See README for usage examples



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/badgeable/award.rb', line 30

def badge(name, options = {}, &block)
  after_callback = options[:after] || :create
  config = Badgeable::Config.new
  config.instance_eval(&block)
  attrs = [:description, :icon].inject({}) {|hash, key| hash.merge(key => config.send(key)) }
  method_name = "award_#{name.titleize.gsub(/\s/, '').underscore}_badge".to_sym
  config.klass.class_eval do
    set_callback after_callback, :after, method_name
    define_method method_name, Proc.new {
      if config.conditions_array.all? {|p| p.call(self) }
        config.subject_proc.call(self).award_badge(name, attrs)
      end
    }
  end
end