mirror of
https://github.com/github/rails.git
synced 2026-04-04 03:00:58 -04:00
ActionMailer should respond_to? to methods handled by method_missing [#700 state:resolved]
Signed-off-by: Joshua Peek <josh@joshpeek.com>
This commit is contained in:
@@ -374,11 +374,16 @@ module ActionMailer #:nodoc:
|
||||
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
|
||||
when /^deliver_([_a-z]\w*)/ then new($1, *parameters).deliver!
|
||||
when "new" then nil
|
||||
def respond_to?(method_symbol, include_private = false) #:nodoc:
|
||||
matches_dynamic_method?(method_symbol) || super
|
||||
end
|
||||
|
||||
def method_missing(method_symbol, *parameters) #:nodoc:
|
||||
match = matches_dynamic_method?(method_symbol)
|
||||
case match[1]
|
||||
when 'create' then new(match[2], *parameters).mail
|
||||
when 'deliver' then new(match[2], *parameters).deliver!
|
||||
when 'new' then nil
|
||||
else super
|
||||
end
|
||||
end
|
||||
@@ -424,6 +429,12 @@ module ActionMailer #:nodoc:
|
||||
def template_root=(root)
|
||||
self.view_paths = ActionView::Base.process_view_paths(root)
|
||||
end
|
||||
|
||||
private
|
||||
def matches_dynamic_method?(method_name) #:nodoc:
|
||||
method_name = method_name.to_s
|
||||
/(create|deliver)_([_a-z]\w*)/.match(method_name) || /^(new)$/.match(method_name)
|
||||
end
|
||||
end
|
||||
|
||||
# Instantiate a new mailer object. If +method_name+ is not +nil+, the mailer
|
||||
|
||||
@@ -968,3 +968,55 @@ class MethodNamingTest < Test::Unit::TestCase
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class RespondToTest < Test::Unit::TestCase
|
||||
class RespondToMailer < ActionMailer::Base; end
|
||||
|
||||
def setup
|
||||
set_delivery_method :test
|
||||
end
|
||||
|
||||
def teardown
|
||||
restore_delivery_method
|
||||
end
|
||||
|
||||
def test_should_respond_to_new
|
||||
assert RespondToMailer.respond_to?(:new)
|
||||
end
|
||||
|
||||
def test_should_respond_to_create_with_template_suffix
|
||||
assert RespondToMailer.respond_to?(:create_any_old_template)
|
||||
end
|
||||
|
||||
def test_should_respond_to_deliver_with_template_suffix
|
||||
assert RespondToMailer.respond_to?(:deliver_any_old_template)
|
||||
end
|
||||
|
||||
def test_should_not_respond_to_new_with_template_suffix
|
||||
assert !RespondToMailer.respond_to?(:new_any_old_template)
|
||||
end
|
||||
|
||||
def test_should_not_respond_to_create_with_template_suffix_unless_it_is_separated_by_an_underscore
|
||||
assert !RespondToMailer.respond_to?(:createany_old_template)
|
||||
end
|
||||
|
||||
def test_should_not_respond_to_deliver_with_template_suffix_unless_it_is_separated_by_an_underscore
|
||||
assert !RespondToMailer.respond_to?(:deliverany_old_template)
|
||||
end
|
||||
|
||||
def test_should_not_respond_to_create_with_template_suffix_if_it_begins_with_a_uppercase_letter
|
||||
assert !RespondToMailer.respond_to?(:create_Any_old_template)
|
||||
end
|
||||
|
||||
def test_should_not_respond_to_deliver_with_template_suffix_if_it_begins_with_a_uppercase_letter
|
||||
assert !RespondToMailer.respond_to?(:deliver_Any_old_template)
|
||||
end
|
||||
|
||||
def test_should_not_respond_to_create_with_template_suffix_if_it_begins_with_a_digit
|
||||
assert !RespondToMailer.respond_to?(:create_1_template)
|
||||
end
|
||||
|
||||
def test_should_not_respond_to_deliver_with_template_suffix_if_it_begins_with_a_digit
|
||||
assert !RespondToMailer.respond_to?(:deliver_1_template)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user