Skip to content

Commit

Permalink
Ensure that inherited helper_methods are available after calling clea…
Browse files Browse the repository at this point in the history
…r_helpers [#5348 state:resolved]

Signed-off-by: José Valim <jose.valim@gmail.com>
  • Loading branch information
jstorimer authored and josevalim committed Aug 28, 2010
1 parent 83f4507 commit 730af48
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 1 deletion.
12 changes: 11 additions & 1 deletion actionpack/lib/abstract_controller/helpers.rb
Expand Up @@ -9,6 +9,9 @@ module Helpers
included do
class_attribute :_helpers
self._helpers = Module.new

class_attribute :_helper_methods
self._helper_methods = Array.new
end

module ClassMethods
Expand Down Expand Up @@ -43,7 +46,10 @@ def inherited(klass)
# * <tt>method[, method]</tt> - A name or names of a method on the controller
# to be made available on the view.
def helper_method(*meths)
meths.flatten.each do |meth|
meths.flatten!
self._helper_methods += meths

meths.each do |meth|
_helpers.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
def #{meth}(*args, &blk)
controller.send(%(#{meth}), *args, &blk)
Expand Down Expand Up @@ -98,7 +104,11 @@ def helper(*args, &block)
# Clears up all existing helpers in this class, only keeping the helper
# with the same name as this class.
def clear_helpers
inherited_helper_methods = _helper_methods
self._helpers = Module.new
self._helper_methods = Array.new

inherited_helper_methods.each { |meth| helper_method meth }
default_helper_module! unless anonymous?
end

Expand Down
31 changes: 31 additions & 0 deletions actionpack/test/controller/helper_test.rb
Expand Up @@ -25,8 +25,27 @@ class AllHelpersController < ActionController::Base
helper :all
end

module ImpressiveLibrary
extend ActiveSupport::Concern
included do
helper_method :useful_function
end

def useful_function() end
end

ActionController::Base.send :include, ImpressiveLibrary

class JustMeController < ActionController::Base
clear_helpers

def flash
render :inline => "<h1><%= notice %></h1>"
end

def lib
render :inline => '<%= useful_function %>'
end
end

class MeTooController < JustMeController
Expand Down Expand Up @@ -104,6 +123,18 @@ def test_default_helpers_only
assert_equal [MeTooHelper, JustMeHelper], MeTooController._helpers.ancestors.reject(&:anonymous?)
end

def test_base_helper_methods_after_clear_helpers
assert_nothing_raised do
call_controller(JustMeController, "flash")
end
end

def test_lib_helper_methods_after_clear_helpers
assert_nothing_raised do
call_controller(JustMeController, "lib")
end
end

def test_all_helpers
methods = AllHelpersController._helpers.instance_methods.map {|m| m.to_s}

Expand Down

0 comments on commit 730af48

Please sign in to comment.