Module: MailMerge

Defined in:
lib/mail_merge.rb,
lib/mail_merge/version.rb

Constant Summary collapse

VERSION =
"0.0.5"

Class Method Summary collapse

Class Method Details

.merge(content, options = {}, merge_fields = [], delimeter = "::", allow_dynamic = false) ⇒ Object

Performs a mail merge based on the options hash that is passed in Example: MailMerge.merge(content, => @site, :user => @user, [‘::site.name::’, ‘::user.full_name::’])

will search text_block.content and find all instances of ::user.
and ::site.

and send the [method] to the associated object

Chaining works as well (ex. ::site.organization.name

yields ‘TST Media’)

Supports finding of objects with this syntax: ::[user-1].full_name

(calls User.find(1).full_name)

  • requires allow_dynamic flag to be true



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
38
39
40
41
# File 'lib/mail_merge.rb', line 9

def self.merge(content, options = {}, merge_fields = [], delimeter = "::", allow_dynamic = false)
  merged = content
  options.keys.each do |key|
    obj = options[key]
    merged = merged.gsub(/#{delimeter}#{key.to_s}\.[\w|\.]*#{delimeter}/) do |s|
      if merge_fields.empty? or merge_fields.include?(s)
        begin
          call_methods(s, obj)
        rescue
          s
        end
      else
        s
      end
    end
  end
  if allow_dynamic
    objects = {}
    merged = merged.gsub(/#{delimeter}\[?\w*(-\d*)?\]?\.[\w|\.]*#{delimeter}/) do |s|
      x = s[/\[?\w*-\d*\]/].delete('[]')
      begin
      unless objects[x]
        class_name, id = x.split('-')
        objects[x] = class_name.camelize.constantize.find(id)
      end
      call_methods(s, objects[x])
      rescue
        s
      end
    end
  end
  merged
end