Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Ensure that inherited helper_methods are available after calling clea…

…r_helpers [#5348 state:resolved]

Signed-off-by: José Valim <jose.valim@gmail.com>
  • Loading branch information...
commit 730af4896358d9125dbd7b8384d66460ae839a45 1 parent 83f4507
@jstorimer jstorimer authored josevalim committed
View
12 actionpack/lib/abstract_controller/helpers.rb
@@ -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
@@ -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)
@@ -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
View
31 actionpack/test/controller/helper_test.rb
@@ -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
@@ -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}
Please sign in to comment.
Something went wrong with that request. Please try again.