ActionMailer: support overriding template name in multipart

Implicit rendering in multipart blocks now also uses the template
name from the options hash instead of always using the action name.

So you can now write

    mail(template_name: template_name) do |format|
      format.text
      format.html
    end
This commit is contained in:
Marcus Ilgner 2015-12-08 12:28:00 +01:00
parent a61e4ae58d
commit 5c54db290f
No known key found for this signature in database
GPG Key ID: E31D682E2F71FB99
4 changed files with 26 additions and 3 deletions

@ -1,3 +1,8 @@
* Mails with multipart `format` blocks with implicit render now also check for
a template name in options hash instead of only using the action name.
*Marcus Ilgner*
* `config.force_ssl = true` will set
`config.action_mailer.default_url_options = { protocol: 'https' }`

@ -893,9 +893,7 @@ def assign_headers_to_message(message, headers)
def collect_responses(headers)
if block_given?
collector = ActionMailer::Collector.new(lookup_context) { render(action_name) }
yield(collector)
collector.responses
collect_responses_from_block(headers, &Proc.new)
elsif headers[:body]
[{
body: headers.delete(:body),
@ -906,6 +904,13 @@ def collect_responses(headers)
end
end
def collect_responses_from_block(headers)
templates_name = headers[:template_name] || action_name
collector = ActionMailer::Collector.new(lookup_context) { render(templates_name) }
yield(collector)
collector.responses
end
def collect_responses_from_templates(headers)
templates_path = headers[:template_path] || self.class.mailer_name
templates_name = headers[:template_name] || action_name

@ -539,6 +539,12 @@ def welcome
assert_equal("TEXT Implicit Multipart", mail.text_part.body.decoded)
end
test "you can specify a different template for multipart render" do
mail = BaseMailer.implicit_different_template_with_block('explicit_multipart_templates').deliver
assert_equal("HTML Explicit Multipart Templates", mail.html_part.body.decoded)
assert_equal("TEXT Explicit Multipart Templates", mail.text_part.body.decoded)
end
test "should raise if missing template in implicit render" do
assert_raises ActionView::MissingTemplate do
BaseMailer.implicit_different_template('missing_template').deliver_now

@ -104,6 +104,13 @@ def implicit_different_template(template_name='')
mail(template_name: template_name)
end
def implicit_different_template_with_block(template_name='')
mail(template_name: template_name) do |format|
format.text
format.html
end
end
def explicit_different_template(template_name='')
mail do |format|
format.text { render template: "#{mailer_name}/#{template_name}" }