mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
adv_attr_accessors in ActionMailer are not sent to the views, use the mailer object if you need to access the subject, recipients, from, etc.
This commit is contained in:
parent
135d32c8bd
commit
ee70d1b6ad
6 changed files with 80 additions and 43 deletions
|
@ -1,29 +1,25 @@
|
|||
module ActionMailer
|
||||
module AdvAttrAccessor #:nodoc:
|
||||
def self.included(base)
|
||||
base.extend(ClassMethods)
|
||||
end
|
||||
def adv_attr_accessor(*names)
|
||||
names.each do |name|
|
||||
ivar = "@#{name}"
|
||||
|
||||
module ClassMethods #:nodoc:
|
||||
def adv_attr_accessor(*names)
|
||||
names.each do |name|
|
||||
ivar = "@#{name}"
|
||||
|
||||
define_method("#{name}=") do |value|
|
||||
instance_variable_set(ivar, value)
|
||||
class_eval <<-ACCESSORS, __FILE__, __LINE__ + 1
|
||||
def #{name}=(value)
|
||||
#{ivar} = value
|
||||
end
|
||||
|
||||
define_method(name) do |*parameters|
|
||||
raise ArgumentError, "expected 0 or 1 parameters" unless parameters.length <= 1
|
||||
if parameters.empty?
|
||||
if instance_variable_names.include?(ivar)
|
||||
instance_variable_get(ivar)
|
||||
end
|
||||
def #{name}(*args)
|
||||
raise ArgumentError, "expected 0 or 1 parameters" unless args.length <= 1
|
||||
if args.empty?
|
||||
#{ivar} if instance_variable_names.include?(#{ivar.inspect})
|
||||
else
|
||||
instance_variable_set(ivar, parameters.first)
|
||||
#{ivar} = args.first
|
||||
end
|
||||
end
|
||||
end
|
||||
ACCESSORS
|
||||
|
||||
self.protected_instance_variables << ivar if self.respond_to?(:protected_instance_variables)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -25,7 +25,8 @@ module ActionMailer #:nodoc:
|
|||
# bcc ["bcc@example.com", "Order Watcher <watcher@example.com>"]
|
||||
# from "system@example.com"
|
||||
# subject "New account information"
|
||||
# body :account => recipient
|
||||
#
|
||||
# @account = recipient
|
||||
# end
|
||||
# end
|
||||
#
|
||||
|
@ -45,13 +46,6 @@ module ActionMailer #:nodoc:
|
|||
# address. Setting this is useful when you want delivery notifications sent to a different address than
|
||||
# the one in <tt>from</tt>.
|
||||
#
|
||||
# The <tt>body</tt> method has special behavior. It takes a hash which generates an instance variable
|
||||
# named after each key in the hash containing the value that that key points to.
|
||||
#
|
||||
# So, for example, <tt>body :account => recipient</tt> would result
|
||||
# in an instance variable <tt>@account</tt> with the value of <tt>recipient</tt> being accessible in the
|
||||
# view.
|
||||
#
|
||||
#
|
||||
# = Mailer views
|
||||
#
|
||||
|
@ -71,7 +65,12 @@ module ActionMailer #:nodoc:
|
|||
# You can even use Action Pack helpers in these views. For example:
|
||||
#
|
||||
# You got a new note!
|
||||
# <%= truncate(note.body, 25) %>
|
||||
# <%= truncate(@note.body, 25) %>
|
||||
#
|
||||
# If you need to access the subject, from or the recipients in the view, you can do that through mailer object:
|
||||
#
|
||||
# You got a new note from <%= mailer.from %>!
|
||||
# <%= truncate(@note.body, 25) %>
|
||||
#
|
||||
#
|
||||
# = Generating URLs
|
||||
|
@ -254,14 +253,15 @@ module ActionMailer #:nodoc:
|
|||
# and appear last in the mime encoded message. You can also pick a different order from inside a method with
|
||||
# +implicit_parts_order+.
|
||||
class Base < AbstractController::Base
|
||||
include AdvAttrAccessor, PartContainer, Quoting, Utils
|
||||
include PartContainer, Quoting, Utils
|
||||
extend AdvAttrAccessor
|
||||
|
||||
include AbstractController::Rendering
|
||||
include AbstractController::LocalizedCache
|
||||
include AbstractController::Layouts
|
||||
include AbstractController::Helpers
|
||||
|
||||
helper ActionMailer::MailHelper
|
||||
helper ActionMailer::MailHelper
|
||||
|
||||
include ActionController::UrlWriter
|
||||
include ActionMailer::DeprecatedBody
|
||||
|
@ -289,7 +289,7 @@ module ActionMailer #:nodoc:
|
|||
@@default_implicit_parts_order = [ "text/html", "text/enriched", "text/plain" ]
|
||||
cattr_accessor :default_implicit_parts_order
|
||||
|
||||
@@protected_instance_variables = []
|
||||
@@protected_instance_variables = %w(@parts @mail)
|
||||
cattr_reader :protected_instance_variables
|
||||
|
||||
# Specify the BCC addresses for the message
|
||||
|
|
|
@ -15,5 +15,10 @@ module ActionMailer
|
|||
|
||||
formatted
|
||||
end
|
||||
|
||||
# Access the mailer instance.
|
||||
def mailer #:nodoc:
|
||||
@controller
|
||||
end
|
||||
end
|
||||
end
|
|
@ -4,7 +4,8 @@ module ActionMailer
|
|||
# and add them to the +parts+ list of the mailer, it is easier
|
||||
# to use the helper methods in ActionMailer::PartContainer.
|
||||
class Part
|
||||
include AdvAttrAccessor, PartContainer, Utils
|
||||
include PartContainer, Utils
|
||||
extend AdvAttrAccessor
|
||||
|
||||
# Represents the body of the part, as a string. This should not be a
|
||||
# Hash (like ActionMailer::Base), but if you want a template to be rendered
|
||||
|
|
|
@ -1,18 +1,36 @@
|
|||
require 'abstract_unit'
|
||||
require 'action_mailer/adv_attr_accessor'
|
||||
|
||||
class AdvAttrTest < Test::Unit::TestCase
|
||||
class AdvAttrTest < ActiveSupport::TestCase
|
||||
class Person
|
||||
include ActionMailer::AdvAttrAccessor
|
||||
cattr_reader :protected_instance_variables
|
||||
@@protected_instance_variables = []
|
||||
|
||||
extend ActionMailer::AdvAttrAccessor
|
||||
adv_attr_accessor :name
|
||||
end
|
||||
|
||||
def test_adv_attr
|
||||
bob = Person.new
|
||||
assert_nil bob.name
|
||||
bob.name 'Bob'
|
||||
assert_equal 'Bob', bob.name
|
||||
def setup
|
||||
@person = Person.new
|
||||
end
|
||||
|
||||
assert_raise(ArgumentError) {bob.name 'x', 'y'}
|
||||
def test_adv_attr
|
||||
assert_nil @person.name
|
||||
@person.name 'Bob'
|
||||
assert_equal 'Bob', @person.name
|
||||
end
|
||||
|
||||
def test_adv_attr_writer
|
||||
assert_nil @person.name
|
||||
@person.name = 'Bob'
|
||||
assert_equal 'Bob', @person.name
|
||||
end
|
||||
|
||||
def test_raise_an_error_with_multiple_args
|
||||
assert_raise(ArgumentError) { @person.name('x', 'y') }
|
||||
end
|
||||
|
||||
def test_ivar_is_added_to_protected_instnace_variables
|
||||
assert Person.protected_instance_variables.include?('@name')
|
||||
end
|
||||
end
|
||||
|
|
|
@ -40,13 +40,20 @@ class RenderMailer < ActionMailer::Base
|
|||
from "tester@example.com"
|
||||
end
|
||||
|
||||
def included_old_subtemplate(recipient)
|
||||
def mailer_accessor(recipient)
|
||||
recipients recipient
|
||||
subject "Including another template in the one being rendered"
|
||||
subject "Mailer Accessor"
|
||||
from "tester@example.com"
|
||||
|
||||
@world = "Earth"
|
||||
render :inline => "Hello, <%= render \"subtemplate\" %>"
|
||||
render :inline => "Look, <%= mailer.subject %>!"
|
||||
end
|
||||
|
||||
def no_instance_variable(recipient)
|
||||
recipients recipient
|
||||
subject "No Instance Variable"
|
||||
from "tester@example.com"
|
||||
|
||||
render :inline => "Look, subject.nil? is <%= @subject.nil? %>!"
|
||||
end
|
||||
|
||||
def initialize_defaults(method_name)
|
||||
|
@ -108,6 +115,16 @@ class RenderHelperTest < Test::Unit::TestCase
|
|||
mail = RenderMailer.deliver_included_subtemplate(@recipient)
|
||||
assert_equal "Hey Ho, let's go!", mail.body.strip
|
||||
end
|
||||
|
||||
def test_mailer_accessor
|
||||
mail = RenderMailer.deliver_mailer_accessor(@recipient)
|
||||
assert_equal "Look, Mailer Accessor!", mail.body.strip
|
||||
end
|
||||
|
||||
def test_no_instance_variable
|
||||
mail = RenderMailer.deliver_no_instance_variable(@recipient)
|
||||
assert_equal "Look, subject.nil? is true!", mail.body.strip
|
||||
end
|
||||
end
|
||||
|
||||
class FirstSecondHelperTest < Test::Unit::TestCase
|
||||
|
|
Loading…
Reference in a new issue