Scott Watermasysk

Still Learning to Code

Simple Resque Mail Queue - II

Here is a slightly cleaned up version of the simple Mail Queue for resque I published a couple of weeks ago.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
module MailQueue
  extend self

  def queue
    :default
  end

  def perform(options = {})
    options = options.with_indifferent_access

    mailer = options[:klass].constantize
    method = options[:method]
    mailer.send(method, *options[:args]).deliver
  end

  def enqueue()
    EnqueueProxy.new(self)
  end

  class EnqueueProxy

    def initialize(klass)
      @klass = klass
    end

    def method_missing(m, *args, &block)
      if @klass.respond_to? m
        options = {:klass => @klass.to_s, :method => m, :args => args}
        Resque.enqueue(MailQueue, options)
      else
        super
      end
    end

  end

end

The biggest change is the options are now all stored in a simple hash with keys for the class, method, and extra arguments. The previous version should continue to work, but if you grabbed this code, I recommend updating to this version since it should be easier to maintain (and debug if necessary) in the future.