mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Remove ActionMailer helpers and rely on AbstractController one.
This commit is contained in:
@@ -34,7 +34,6 @@ module ActionMailer
|
||||
autoload :AdvAttrAccessor, 'action_mailer/adv_attr_accessor'
|
||||
autoload :Base, 'action_mailer/base'
|
||||
autoload :DeliveryMethod, 'action_mailer/delivery_method'
|
||||
autoload :Helpers, 'action_mailer/helpers'
|
||||
autoload :Part, 'action_mailer/part'
|
||||
autoload :PartContainer, 'action_mailer/part_container'
|
||||
autoload :Quoting, 'action_mailer/quoting'
|
||||
|
||||
@@ -256,6 +256,9 @@ module ActionMailer #:nodoc:
|
||||
include AbstractController::RenderingController
|
||||
include AbstractController::Layouts
|
||||
|
||||
include AbstractController::Helpers
|
||||
helper MailHelper
|
||||
|
||||
if Object.const_defined?(:ActionController)
|
||||
include ActionController::UrlWriter
|
||||
end
|
||||
@@ -442,6 +445,7 @@ module ActionMailer #:nodoc:
|
||||
self.view_paths && self.view_paths.first
|
||||
end
|
||||
|
||||
# Should template root overwrite the whole view_paths?
|
||||
def template_root=(root)
|
||||
self.view_paths = ActionView::Base.process_view_paths(root)
|
||||
end
|
||||
@@ -470,6 +474,11 @@ module ActionMailer #:nodoc:
|
||||
|
||||
# If an explicit, textual body has not been set, we check assumptions.
|
||||
unless String === @body
|
||||
# TODO Hax
|
||||
@body.each do |k, v|
|
||||
instance_variable_set(:"@#{k}", v)
|
||||
end
|
||||
|
||||
# First, we look to see if there are any likely templates that match,
|
||||
# which include the content-type in their file name (i.e.,
|
||||
# "the_template_file.text.html.erb", etc.). Only do this if parts
|
||||
@@ -480,7 +489,7 @@ module ActionMailer #:nodoc:
|
||||
:content_type => template.mime_type ? template.mime_type.to_s : "text/plain",
|
||||
:disposition => "inline",
|
||||
:charset => charset,
|
||||
:body => render_template(template, @body)
|
||||
:body => render_to_string(:_template => template)
|
||||
)
|
||||
end
|
||||
|
||||
@@ -562,16 +571,10 @@ module ActionMailer #:nodoc:
|
||||
@sent_on ||= Time.now
|
||||
end
|
||||
|
||||
def render_template(template, body)
|
||||
if template.respond_to?(:mime_type)
|
||||
@current_template_content_type = template.mime_type && template.mime_type.to_sym.to_s
|
||||
end
|
||||
|
||||
@template = initialize_template_class(body)
|
||||
layout = _layout_for_option(:default, :formats => formats)
|
||||
@template._render_template(template, layout, {})
|
||||
ensure
|
||||
@current_template_content_type = nil
|
||||
def _determine_template(options)
|
||||
super
|
||||
layout = options.key?(:layout) ? options[:layout] : :default
|
||||
options[:_layout] = _layout_for_option(layout, options[:_template].details)
|
||||
end
|
||||
|
||||
def render_message(method_name, body)
|
||||
@@ -701,9 +704,4 @@ module ActionMailer #:nodoc:
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Base.class_eval do
|
||||
include Helpers
|
||||
helper MailHelper
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,114 +0,0 @@
|
||||
require 'active_support/dependencies'
|
||||
|
||||
module ActionMailer
|
||||
module Helpers #:nodoc:
|
||||
def self.included(base) #:nodoc:
|
||||
# Initialize the base module to aggregate its helpers.
|
||||
base.class_inheritable_accessor :master_helper_module
|
||||
base.master_helper_module = Module.new
|
||||
|
||||
# Extend base with class methods to declare helpers.
|
||||
base.extend(ClassMethods)
|
||||
|
||||
base.class_eval do
|
||||
# Wrap inherited to create a new master helper module for subclasses.
|
||||
class << self
|
||||
alias_method_chain :inherited, :helper
|
||||
end
|
||||
|
||||
# Wrap initialize_template_class to extend new template class
|
||||
# instances with the master helper module.
|
||||
alias_method_chain :initialize_template_class, :helper
|
||||
end
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
# Makes all the (instance) methods in the helper module available to templates rendered through this controller.
|
||||
# See ActionView::Helpers (link:classes/ActionView/Helpers.html) for more about making your own helper modules
|
||||
# available to the templates.
|
||||
def add_template_helper(helper_module) #:nodoc:
|
||||
master_helper_module.module_eval "include #{helper_module}"
|
||||
end
|
||||
|
||||
# Declare a helper:
|
||||
# helper :foo
|
||||
# requires 'foo_helper' and includes FooHelper in the template class.
|
||||
# helper FooHelper
|
||||
# includes FooHelper in the template class.
|
||||
# helper { def foo() "#{bar} is the very best" end }
|
||||
# evaluates the block in the template class, adding method +foo+.
|
||||
# helper(:three, BlindHelper) { def mice() 'mice' end }
|
||||
# does all three.
|
||||
def helper(*args, &block)
|
||||
args.flatten.each do |arg|
|
||||
case arg
|
||||
when Module
|
||||
add_template_helper(arg)
|
||||
when String, Symbol
|
||||
file_name = arg.to_s.underscore + '_helper'
|
||||
class_name = file_name.camelize
|
||||
|
||||
require_dependency(file_name, "Missing helper file helpers/%s.rb")
|
||||
# begin
|
||||
# require_dependency(file_name)
|
||||
# rescue LoadError => load_error
|
||||
# requiree = / -- (.*?)(\.rb)?$/.match(load_error.message).to_a[1]
|
||||
# msg = (requiree == file_name) ? "Missing helper file helpers/#{file_name}.rb" : "Can't load file: #{requiree}"
|
||||
# raise LoadError.new(msg).copy_blame!(load_error)
|
||||
# end
|
||||
|
||||
add_template_helper(class_name.constantize)
|
||||
else
|
||||
raise ArgumentError, 'helper expects String, Symbol, or Module argument'
|
||||
end
|
||||
end
|
||||
|
||||
# Evaluate block in template class if given.
|
||||
master_helper_module.module_eval(&block) if block_given?
|
||||
end
|
||||
|
||||
# Declare a controller method as a helper. For example,
|
||||
# helper_method :link_to
|
||||
# def link_to(name, options) ... end
|
||||
# makes the link_to controller method available in the view.
|
||||
def helper_method(*methods)
|
||||
methods.flatten.each do |method|
|
||||
master_helper_module.module_eval <<-end_eval
|
||||
def #{method}(*args, &block)
|
||||
controller.__send__(%(#{method}), *args, &block)
|
||||
end
|
||||
end_eval
|
||||
end
|
||||
end
|
||||
|
||||
# Declare a controller attribute as a helper. For example,
|
||||
# helper_attr :name
|
||||
# attr_accessor :name
|
||||
# makes the name and name= controller methods available in the view.
|
||||
# The is a convenience wrapper for helper_method.
|
||||
def helper_attr(*attrs)
|
||||
attrs.flatten.each { |attr| helper_method(attr, "#{attr}=") }
|
||||
end
|
||||
|
||||
private
|
||||
def inherited_with_helper(child)
|
||||
inherited_without_helper(child)
|
||||
begin
|
||||
child.master_helper_module = Module.new
|
||||
child.master_helper_module.__send__(:include, master_helper_module)
|
||||
child.helper child.name.to_s.underscore
|
||||
rescue MissingSourceFile => e
|
||||
raise unless e.is_missing?("#{child.name.to_s.underscore}_helper")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
# Extend the template class instance with our controller's helper module.
|
||||
def initialize_template_class_with_helper(assigns)
|
||||
initialize_template_class_without_helper(assigns).tap do |template|
|
||||
template.extend self.class.master_helper_module
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,5 +1,6 @@
|
||||
# encoding: utf-8
|
||||
require 'abstract_unit'
|
||||
require 'active_support/testing/pending'
|
||||
|
||||
class FunkyPathMailer < ActionMailer::Base
|
||||
self.template_root = "#{File.dirname(__FILE__)}/fixtures/path.with.dots"
|
||||
@@ -279,7 +280,7 @@ class TestMailer < ActionMailer::Base
|
||||
body :body => "foo", :bar => "baz"
|
||||
end
|
||||
|
||||
class <<self
|
||||
class << self
|
||||
attr_accessor :received_body
|
||||
end
|
||||
|
||||
@@ -290,6 +291,7 @@ end
|
||||
|
||||
class ActionMailerTest < Test::Unit::TestCase
|
||||
include ActionMailer::Quoting
|
||||
include ActiveSupport::Testing::Pending
|
||||
|
||||
def encode( text, charset="utf-8" )
|
||||
quoted_printable( text, charset )
|
||||
@@ -977,8 +979,10 @@ EOF
|
||||
end
|
||||
|
||||
def test_body_is_stored_as_an_ivar
|
||||
mail = TestMailer.create_body_ivar(@recipient)
|
||||
assert_equal "body: foo\nbar: baz", mail.body
|
||||
pending "needs attr_internal on @body" do
|
||||
mail = TestMailer.create_body_ivar(@recipient)
|
||||
assert_equal "body: foo\nbar: baz", mail.body
|
||||
end
|
||||
end
|
||||
|
||||
def test_starttls_is_enabled_if_supported
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
require 'active_support/dependencies'
|
||||
|
||||
module AbstractController
|
||||
module Helpers
|
||||
extend ActiveSupport::Concern
|
||||
@@ -57,23 +59,48 @@ module AbstractController
|
||||
end
|
||||
end
|
||||
|
||||
# Make a number of helper modules part of this class' default
|
||||
# helpers.
|
||||
# The +helper+ class method can take a series of helper module names, a block, or both.
|
||||
#
|
||||
# ==== Parameters
|
||||
# *args<Array[Module]>:: Modules to be included
|
||||
# block<Block>:: Evalulate the block in the context
|
||||
# of the helper module. Any methods defined in the block
|
||||
# will be helpers.
|
||||
# *args<Array[Module, Symbol, String, :all]>
|
||||
# block<Block>:: A block defining helper methods
|
||||
#
|
||||
# ==== Examples
|
||||
# When the argument is a module it will be included directly in the template class.
|
||||
# helper FooHelper # => includes FooHelper
|
||||
#
|
||||
# When the argument is a string or symbol, the method will provide the "_helper" suffix, require the file
|
||||
# and include the module in the template class. The second form illustrates how to include custom helpers
|
||||
# when working with namespaced controllers, or other cases where the file containing the helper definition is not
|
||||
# in one of Rails' standard load paths:
|
||||
# helper :foo # => requires 'foo_helper' and includes FooHelper
|
||||
# helper 'resources/foo' # => requires 'resources/foo_helper' and includes Resources::FooHelper
|
||||
#
|
||||
# Additionally, the +helper+ class method can receive and evaluate a block, making the methods defined available
|
||||
# to the template.
|
||||
#
|
||||
# # One line
|
||||
# helper { def hello() "Hello, world!" end }
|
||||
#
|
||||
# # Multi-line
|
||||
# helper do
|
||||
# def foo(bar)
|
||||
# "#{bar} is the very best"
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# Finally, all the above styles can be mixed together, and the +helper+ method can be invoked with a mix of
|
||||
# +symbols+, +strings+, +modules+ and blocks.
|
||||
#
|
||||
# helper(:three, BlindHelper) { def mice() 'mice' end }
|
||||
#
|
||||
def helper(*args, &block)
|
||||
self._helper_serial = AbstractController::Helpers.next_serial + 1
|
||||
|
||||
args.flatten.each do |arg|
|
||||
case arg
|
||||
when Module
|
||||
add_template_helper(arg)
|
||||
end
|
||||
_modules_for_helpers(args).each do |mod|
|
||||
add_template_helper(mod)
|
||||
end
|
||||
|
||||
_helpers.module_eval(&block) if block_given?
|
||||
end
|
||||
|
||||
@@ -87,6 +114,38 @@ module AbstractController
|
||||
def add_template_helper(mod)
|
||||
_helpers.module_eval { include mod }
|
||||
end
|
||||
|
||||
# Returns a list of modules, normalized from the acceptable kinds of
|
||||
# helpers with the following behavior:
|
||||
#
|
||||
# String or Symbol:: :FooBar or "FooBar" becomes "foo_bar_helper",
|
||||
# and "foo_bar_helper.rb" is loaded using require_dependency.
|
||||
#
|
||||
# Module:: No further processing
|
||||
#
|
||||
# After loading the appropriate files, the corresponding modules
|
||||
# are returned.
|
||||
#
|
||||
# ==== Parameters
|
||||
# args<Array[String, Symbol, Module]>:: A list of helpers
|
||||
#
|
||||
# ==== Returns
|
||||
# Array[Module]:: A normalized list of modules for the list of
|
||||
# helpers provided.
|
||||
def _modules_for_helpers(args)
|
||||
args.flatten.map! do |arg|
|
||||
case arg
|
||||
when String, Symbol
|
||||
file_name = "#{arg.to_s.underscore}_helper"
|
||||
require_dependency(file_name, "Missing helper file helpers/%s.rb")
|
||||
file_name.camelize.constantize
|
||||
when Module
|
||||
arg
|
||||
else
|
||||
raise ArgumentError, "helper must be a String, Symbol, or Module"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
require 'active_support/dependencies'
|
||||
|
||||
module ActionController
|
||||
# The Rails framework provides a large number of helpers for working with +assets+, +dates+, +forms+,
|
||||
# +numbers+ and model objects, to name a few. These helpers are available to all templates
|
||||
@@ -64,46 +62,6 @@ module ActionController
|
||||
super
|
||||
end
|
||||
|
||||
# The +helper+ class method can take a series of helper module names, a block, or both.
|
||||
#
|
||||
# ==== Parameters
|
||||
# *args<Array[Module, Symbol, String, :all]>
|
||||
# block<Block>:: A block defining helper methods
|
||||
#
|
||||
# ==== Examples
|
||||
# When the argument is a string or symbol, the method will provide the "_helper" suffix, require the file
|
||||
# and include the module in the template class. The second form illustrates how to include custom helpers
|
||||
# when working with namespaced controllers, or other cases where the file containing the helper definition is not
|
||||
# in one of Rails' standard load paths:
|
||||
# helper :foo # => requires 'foo_helper' and includes FooHelper
|
||||
# helper 'resources/foo' # => requires 'resources/foo_helper' and includes Resources::FooHelper
|
||||
#
|
||||
# When the argument is a module it will be included directly in the template class.
|
||||
# helper FooHelper # => includes FooHelper
|
||||
#
|
||||
# When the argument is the symbol <tt>:all</tt>, the controller will include all helpers beneath
|
||||
# <tt>ActionController::Base.helpers_dir</tt> (defaults to <tt>app/helpers/**/*.rb</tt> under RAILS_ROOT).
|
||||
# helper :all
|
||||
#
|
||||
# Additionally, the +helper+ class method can receive and evaluate a block, making the methods defined available
|
||||
# to the template.
|
||||
# # One line
|
||||
# helper { def hello() "Hello, world!" end }
|
||||
# # Multi-line
|
||||
# helper do
|
||||
# def foo(bar)
|
||||
# "#{bar} is the very best"
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# Finally, all the above styles can be mixed together, and the +helper+ method can be invoked with a mix of
|
||||
# +symbols+, +strings+, +modules+ and blocks.
|
||||
# helper(:three, BlindHelper) { def mice() 'mice' end }
|
||||
#
|
||||
def helper(*args, &block)
|
||||
super(*_modules_for_helpers(args), &block)
|
||||
end
|
||||
|
||||
# Declares helper accessors for controller attributes. For example, the
|
||||
# following adds new +name+ and <tt>name=</tt> instance methods to a
|
||||
# controller and makes them available to the view:
|
||||
@@ -123,15 +81,8 @@ module ActionController
|
||||
end
|
||||
|
||||
private
|
||||
# Returns a list of modules, normalized from the acceptable kinds of
|
||||
# helpers with the following behavior:
|
||||
# String or Symbol:: :FooBar or "FooBar" becomes "foo_bar_helper",
|
||||
# and "foo_bar_helper.rb" is loaded using require_dependency.
|
||||
# :all:: Loads all modules in the #helpers_dir
|
||||
# Module:: No further processing
|
||||
#
|
||||
# After loading the appropriate files, the corresponding modules
|
||||
# are returned.
|
||||
# Overwrite _modules_for_helpers to accept :all as argument, which loads
|
||||
# all helpers in helpers_dir.
|
||||
#
|
||||
# ==== Parameters
|
||||
# args<Array[String, Symbol, Module, all]>:: A list of helpers
|
||||
@@ -140,20 +91,8 @@ module ActionController
|
||||
# Array[Module]:: A normalized list of modules for the list of
|
||||
# helpers provided.
|
||||
def _modules_for_helpers(args)
|
||||
args.flatten.map! do |arg|
|
||||
case arg
|
||||
when :all
|
||||
_modules_for_helpers all_application_helpers
|
||||
when String, Symbol
|
||||
file_name = "#{arg.to_s.underscore}_helper"
|
||||
require_dependency(file_name, "Missing helper file helpers/%s.rb")
|
||||
file_name.camelize.constantize
|
||||
when Module
|
||||
arg
|
||||
else
|
||||
raise ArgumentError, "helper must be a String, Symbol, or Module"
|
||||
end
|
||||
end
|
||||
args += all_application_helpers if args.delete(:all)
|
||||
super(args)
|
||||
end
|
||||
|
||||
def default_helper_module!
|
||||
|
||||
@@ -133,4 +133,4 @@ module ActionView
|
||||
content
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user