Skip to content

Commit

Permalink
Update ActionMailer so it treats ActionView the same way that ActionC…
Browse files Browse the repository at this point in the history
…ontroller does. Closes rails#10244 [rick]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8212 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information
technoweenie committed Nov 26, 2007
1 parent 3d67860 commit bd5ed65
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 7 deletions.
5 changes: 5 additions & 0 deletions actionmailer/CHANGELOG
@@ -1,5 +1,10 @@
*SVN*

* Update ActionMailer so it treats ActionView the same way that ActionController does. Closes #10244 [rick]

* Pass the template_root as an array as ActionView's view_path
* Request templates with the "#{mailer_name}/#{action}" as opposed to just "#{action}"

* Fixed that partials would be broken when using text.plain.erb as the extension #10130 [java]

* Update README to use new smtp settings configuration API. Closes #10060 [psq]
Expand Down
35 changes: 29 additions & 6 deletions actionmailer/lib/action_mailer/base.rb
Expand Up @@ -298,11 +298,6 @@ class Base
# This defaults to the value for the +default_implicit_parts_order+.
adv_attr_accessor :implicit_parts_order

# Override the mailer name, which defaults to an inflected version of the
# mailer's class name. If you want to use a template in a non-standard
# location, you can use this to specify that location.
adv_attr_accessor :mailer_name

# Defaults to "1.0", but may be explicitly given if needed.
adv_attr_accessor :mime_version

Expand All @@ -322,10 +317,35 @@ class Base
# have multiple mailer methods share the same template.
adv_attr_accessor :template

# Override the mailer name, which defaults to an inflected version of the
# mailer's class name. If you want to use a template in a non-standard
# location, you can use this to specify that location.
def mailer_name(value = nil)
if value
self.mailer_name = value
else
self.class.mailer_name
end
end

def mailer_name=(value)
self.class.mailer_name = value
end

# The mail object instance referenced by this mailer.
attr_reader :mail

class << self
attr_writer :mailer_name

def mailer_name
@mailer_name ||= name.underscore
end

# for ActionView compatibility
alias_method :controller_name, :mailer_name
alias_method :controller_path, :mailer_name

def method_missing(method_symbol, *parameters)#:nodoc:
case method_symbol.id2name
when /^create_([_a-z]\w*)/ then new($1, *parameters).mail
Expand Down Expand Up @@ -476,6 +496,9 @@ def render_message(method_name, body)

def render(opts)
body = opts.delete(:body)
if opts[:file] && opts[:file] !~ /\//
opts[:file] = "#{mailer_name}/#{opts[:file]}"
end
initialize_template_class(body).render(opts)
end

Expand All @@ -484,7 +507,7 @@ def template_path
end

def initialize_template_class(assigns)
ActionView::Base.new(template_path, assigns, self)
ActionView::Base.new([template_root], assigns, self)
end

def sort_parts(parts, order = [])
Expand Down
@@ -1 +1 @@
Hey Ho, <%= render "subtemplate" %>
Hey Ho, <%= render :partial => "subtemplate" %>
13 changes: 13 additions & 0 deletions actionmailer/test/mail_render_test.rb
Expand Up @@ -26,6 +26,13 @@ def included_subtemplate(recipient)
subject "Including another template in the one being rendered"
from "tester@example.com"
end

def included_old_subtemplate(recipient)
recipients recipient
subject "Including another template in the one being rendered"
from "tester@example.com"
body render(:inline => "Hello, <%= render \"subtemplate\" %>", :body => { :world => "Earth" })
end

def initialize_defaults(method_name)
super
Expand Down Expand Up @@ -81,6 +88,12 @@ def test_included_subtemplate
mail = RenderMailer.deliver_included_subtemplate(@recipient)
assert_equal "Hey Ho, let's go!", mail.body.strip
end

def test_deprecated_old_subtemplate
assert_raises ActionView::ActionViewError do
RenderMailer.deliver_included_old_subtemplate(@recipient)
end
end
end

class FirstSecondHelperTest < Test::Unit::TestCase
Expand Down

0 comments on commit bd5ed65

Please sign in to comment.