Set sort order for explicit parts from the collector's template sequence

This commit is contained in:
José Valim and Mikel Lindsaar 2010-01-24 09:34:50 +11:00
parent c985a0ee3d
commit e7e4ed48df
2 changed files with 17 additions and 14 deletions

View File

@ -415,7 +415,7 @@ module ActionMailer #:nodoc:
# Should be removed when old API is deprecated
@mail_was_called = true
m, sort_parts = @message, true
m = @message
# Give preference to headers and fallback to the ones set in mail
content_type = headers[:content_type] || m.content_type
@ -425,12 +425,16 @@ module ActionMailer #:nodoc:
headers[:subject] ||= default_subject
quote_fields(m, headers, charset)
sort_order = headers[:parts_order] || self.class.default_implicit_parts_order.dup
responses = if headers[:body]
[ { :body => headers[:body], :content_type => self.class.default_content_type.dup } ]
elsif block_given?
sort_parts = false
collector = ActionMailer::Collector.new(self) { render(action_name) }
yield(collector)
# Collect the sort order of the parts from the collector as Mail will always
# sort parts on encode into a "sane" sequence.
sort_order = collector.responses.map { |r| r[:content_type] }
collector.responses
else
# TODO Ensure that we don't need to pass I18n.locale as detail
@ -447,8 +451,8 @@ module ActionMailer #:nodoc:
m.charset = charset
m.mime_version = mime_version
if sort_parts && m.parts.present?
m.body.set_sort_order(headers[:parts_order] || self.class.default_implicit_parts_order.dup)
if m.multipart?
m.body.set_sort_order(sort_order)
m.body.sort_parts!
end

View File

@ -304,16 +304,15 @@ class BaseTest < ActiveSupport::TestCase
assert_equal("HTML Explicit Multipart", email.parts[1].parts[1].body.encoded)
end
# TODO Seems Mail is sorting the templates automatically, and not on demand
# test "explicit multipart with templates" do
# email = BaseMailer.deliver_explicit_multipart_templates
# assert_equal(2, email.parts.size)
# assert_equal("multipart/alternate", email.mime_type)
# assert_equal("text/html", email.parts[0].mime_type)
# assert_equal("HTML Explicit Multipart Templates", email.parts[0].body.encoded)
# assert_equal("text/plain", email.parts[1].mime_type)
# assert_equal("TEXT Explicit Multipart Templates", email.parts[1].body.encoded)
# end
test "explicit multipart with templates" do
email = BaseMailer.deliver_explicit_multipart_templates
assert_equal(2, email.parts.size)
assert_equal("multipart/alternate", email.mime_type)
assert_equal("text/html", email.parts[0].mime_type)
assert_equal("HTML Explicit Multipart Templates", email.parts[0].body.encoded)
assert_equal("text/plain", email.parts[1].mime_type)
assert_equal("TEXT Explicit Multipart Templates", email.parts[1].body.encoded)
end
test "explicit multipart with any" do
email = BaseMailer.deliver_explicit_multipart_with_any