Permalink
Browse files

Write documentation for AbstractController::Helpers

  • Loading branch information...
1 parent d7e0cb0 commit acb244778587ff400f5b1d54e27028a2dae91101 Yehuda Katz + Carl Lerche committed Jun 9, 2009
@@ -5,33 +5,26 @@ module Helpers
include Renderer
included do
- extlib_inheritable_accessor :master_helper_module
- self.master_helper_module = Module.new
+ extlib_inheritable_accessor(:_helpers) { Module.new }
end
+ # Override AbstractController::Renderer's _action_view to include the
+ # helper module for this class into its helpers module.
def _action_view
- @_action_view ||= begin
- av = super
- av.helpers.send(:include, master_helper_module)
- av
- end
+ @_action_view ||= super.tap { |av| av.helpers.include(_helpers) }
end
module ClassMethods
+ # When a class is inherited, wrap its helper module in a new module.
+ # This ensures that the parent class's module can be changed
+ # independently of the child class's.
def inherited(klass)
- klass.master_helper_module = Module.new
- klass.master_helper_module.__send__ :include, master_helper_module
+ helpers = _helpers
+ klass._helpers = Module.new { include helpers }
super
end
- # 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(mod)
- master_helper_module.module_eval { include mod }
- end
-
# Declare a controller method as a helper. For example, the following
# makes the +current_user+ controller method available to the view:
# class ApplicationController < ActionController::Base
@@ -48,24 +41,47 @@ def add_template_helper(mod)
#
# In a view:
# <% if logged_in? -%>Welcome, <%= current_user.name %><% end -%>
+ #
+ # ==== Parameters
+ # meths<Array[#to_s]>:: The name of a method on the controller
+ # to be made available on the view.
def helper_method(*meths)
meths.flatten.each do |meth|
- master_helper_module.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
+ _helpers.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
def #{meth}(*args, &blk)
controller.send(%(#{meth}), *args, &blk)
end
ruby_eval
end
end
+ # Make a number of helper modules part of this class' default
+ # helpers.
+ #
+ # ==== 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.
def helper(*args, &block)
args.flatten.each do |arg|
case arg
when Module
add_template_helper(arg)
end
end
- master_helper_module.module_eval(&block) if block_given?
+ _helpers.module_eval(&block) if block_given?
+ end
+
+ private
+ # Makes all the (instance) methods in the helper module available to templates
+ # rendered through this controller.
+ #
+ # ==== Parameters
+ # mod<Module>:: The module to include into the current helper module
+ # for the class
+ def add_template_helper(mod)
+ _helpers.module_eval { include mod }
end
end
end
@@ -29,6 +29,9 @@ module Renderer
# partial<Boolean>:: Whether or not the template to render is a partial
# _partial:: If a partial, rather than a template, was rendered, return
# the partial.
+ # helpers:: A module containing the helpers to be used in the view. This
+ # module should respond_to include.
+ # controller:: The controller that initialized the ActionView
#
# Override this method in a to change the default behavior.
def _action_view
@@ -83,7 +83,7 @@ def helper(*args, &block)
end
# Evaluate block in template class if given.
- master_helper_module.module_eval(&block) if block_given?
+ _helpers.module_eval(&block) if block_given?
end
# Declares helper accessors for controller attributes. For example, the
@@ -99,7 +99,7 @@ def helper_attr(*attrs)
def helpers
unless @helper_proxy
@helper_proxy = ActionView::Base.new
- @helper_proxy.extend master_helper_module
+ @helper_proxy.extend _helpers
else
@helper_proxy
end
@@ -127,7 +127,11 @@ def test_helper_for_acronym_controller
end
def test_all_helpers
- methods = AllHelpersController.master_helper_module.instance_methods.map {|m| m.to_s}
+ methods = if defined?(ActionController::Http)
+ AllHelpersController._helpers.instance_methods.map {|m| m.to_s}
+ else
+ AllHelpersController.master_helper_module.instance_methods.map {|m| m.to_s}
+ end
# abc_helper.rb
assert methods.include?('bare_a')
@@ -143,7 +147,12 @@ def test_all_helpers_with_alternate_helper_dir
@controller_class.helpers_dir = File.dirname(__FILE__) + '/../fixtures/alternate_helpers'
# Reload helpers
- @controller_class.master_helper_module = Module.new
+ if defined?(ActionController::Http)
+ @controller_class._helpers = Module.new
+ else
+ @controller_class.master_helper_module = Module.new
+ end
+
@controller_class.helper :all
# helpers/abc_helper.rb should not be included
@@ -175,7 +184,11 @@ def expected_helper_methods
end
def master_helper_methods
- @controller_class.master_helper_module.instance_methods.map {|m| m.to_s }
+ if defined?(ActionController::Http)
+ @controller_class._helpers.instance_methods.map {|m| m.to_s }
+ else
+ @controller_class.master_helper_module.instance_methods.map {|m| m.to_s }
+ end
end
def missing_methods

0 comments on commit acb2447

Please sign in to comment.