From 9cf33b55f39779b98604e1652affc2c64873dd9b Mon Sep 17 00:00:00 2001 From: Nate Berkopec Date: Sat, 27 Oct 2012 14:28:42 -0400 Subject: Explicit multipart messages respect :parts_order As issue #7978, the order in which ActionMailer sends multipart messages could be unintentionally overwritten if a block is passed to the mail method. This changes the mail method such that :parts_order is always respected, regardless of whether a block is passed to mail. --- actionmailer/lib/action_mailer/base.rb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'actionmailer/lib') diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb index 6a9828fde7..2b533ad054 100644 --- a/actionmailer/lib/action_mailer/base.rb +++ b/actionmailer/lib/action_mailer/base.rb @@ -698,7 +698,7 @@ module ActionMailer assignable.each { |k, v| m[k] = v } # Render the templates and blocks - responses, explicit_order = collect_responses_and_parts_order(headers, &block) + responses = collect_responses(headers, &block) create_parts_from_responses(m, responses) # Setup content type, reapply charset and handle parts order @@ -706,8 +706,7 @@ module ActionMailer m.charset = charset if m.multipart? - parts_order ||= explicit_order || headers[:parts_order] - m.body.set_sort_order(parts_order) + m.body.set_sort_order(headers[:parts_order]) m.body.sort_parts! end @@ -742,14 +741,13 @@ module ActionMailer I18n.t(:subject, scope: [mailer_scope, action_name], default: action_name.humanize) end - def collect_responses_and_parts_order(headers) #:nodoc: - responses, parts_order = [], nil + def collect_responses(headers) #:nodoc: + responses = [] if block_given? collector = ActionMailer::Collector.new(lookup_context) { render(action_name) } yield(collector) - parts_order = collector.responses.map { |r| r[:content_type] } - responses = collector.responses + responses = collector.responses elsif headers[:body] responses << { body: headers.delete(:body), @@ -769,7 +767,7 @@ module ActionMailer end end - [responses, parts_order] + responses end def each_template(paths, name, &block) #:nodoc: -- cgit v1.2.3