aboutsummaryrefslogtreecommitdiffstats
path: root/actionmailer/lib/action_mailer/deprecated_api.rb
blob: 0eb8d85676ac3bae5698634b20a8215d2959f8ab (plain) (blame)
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
module ActionMailer
  # This is the API which is deprecated and is going to be removed on Rails 3.1 release.
  # Part of the old API will be deprecated after 3.1, for a smoother deprecation process.
  # Chech those in OldApi instead.
  module DeprecatedApi #:nodoc:
    extend ActiveSupport::Concern

    module ClassMethods

      # Deliver the given mail object directly. This can be used to deliver
      # a preconstructed mail object, like:
      #
      #   email = MyMailer.create_some_mail(parameters)
      #   email.set_some_obscure_header "frobnicate"
      #   MyMailer.deliver(email)
      def deliver(mail, show_warning=true)
        if show_warning
          ActiveSupport::Deprecation.warn "#{self}.deliver is deprecated, call " <<
            "deliver in the mailer instance instead", caller[0,2]
        end

        raise "no mail object available for delivery!" unless mail
        wrap_delivery_behavior(mail)
        mail.deliver
        mail
      end

      def template_root
        self.view_paths && self.view_paths.first
      end

      def template_root=(root)
        ActiveSupport::Deprecation.warn "template_root= is deprecated, use view_paths.unshift instead", caller[0,2]
        self.view_paths = ActionView::Base.process_view_paths(root)
      end

      def respond_to?(method_symbol, include_private = false)
        matches_dynamic_method?(method_symbol) || super
      end

      def method_missing(method_symbol, *parameters)
        if match = matches_dynamic_method?(method_symbol)
          case match[1]
            when 'create'
              ActiveSupport::Deprecation.warn "#{self}.create_#{match[2]} is deprecated, " <<
                "use #{self}.#{match[2]} instead", caller[0,2]
              new(match[2], *parameters).message
            when 'deliver'
              ActiveSupport::Deprecation.warn "#{self}.deliver_#{match[2]} is deprecated, " <<
                "use #{self}.#{match[2]}.deliver instead", caller[0,2]
              new(match[2], *parameters).message.deliver
            else super
          end
        else
          super
        end
      end

    private

      def matches_dynamic_method?(method_name)
        method_name = method_name.to_s
        /^(create|deliver)_([_a-z]\w*)/.match(method_name) || /^(new)$/.match(method_name)
      end
    end

    # Delivers a Mail object. By default, it delivers the cached mail
    # object (from the <tt>create!</tt> method). If no cached mail object exists, and
    # no alternate has been given as the parameter, this will fail.
    def deliver!(mail = @_message)
      ActiveSupport::Deprecation.warn "Calling deliver in the AM::Base object is deprecated, " <<
        "please call deliver in the Mail instance", caller[0,2]
      self.class.deliver(mail, false)
    end
    alias :deliver :deliver!

    def render(*args)
      options = args.last.is_a?(Hash) ? args.last : {}
      if options[:body]
        ActiveSupport::Deprecation.warn(':body in render deprecated. Please use instance ' <<
                                        'variables as assigns instead', caller[0,1])
        body options.delete(:body)
      end
      super
    end

    # Render a message but does not set it as mail body. Useful for rendering
    # data for part and attachments.
    #
    # Examples:
    #
    #   render_message "special_message"
    #   render_message :template => "special_message"
    #   render_message :inline => "<%= 'Hi!' %>"
    #
    def render_message(*args)
      ActiveSupport::Deprecation.warn "render_message is deprecated, use render instead", caller[0,2]
      render(*args)
    end

  private
    
    def create_parts
      if @body.is_a?(Hash) && !@body.empty?
        ActiveSupport::Deprecation.warn "Giving a hash to body is deprecated, please use instance variables instead", caller[0,2]
        @body.each { |k, v| instance_variable_set(:"@#{k}", v) }
      end
      super
    end

  end
end