diff options
author | John Hawthorn <john@hawthorn.email> | 2019-06-05 08:20:50 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-05 08:20:50 -0700 |
commit | 08e97650d6498eaf9fd1a5a275184bbd826a4412 (patch) | |
tree | ba765b41dee587c8812b840dcbab81ae47364e77 /actionpack/lib | |
parent | ccb30615a3b6d5fd78b94fe44155310854241f6a (diff) | |
parent | 4ab00cfac0c5bda7b66c5f80c63a8e858d4eac02 (diff) | |
download | rails-08e97650d6498eaf9fd1a5a275184bbd826a4412.tar.gz rails-08e97650d6498eaf9fd1a5a275184bbd826a4412.tar.bz2 rails-08e97650d6498eaf9fd1a5a275184bbd826a4412.zip |
Merge pull request #36399 from jhawthorn/named_controller_helper_module
Name helper_method module and improve source location
Diffstat (limited to 'actionpack/lib')
-rw-r--r-- | actionpack/lib/abstract_controller/helpers.rb | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/actionpack/lib/abstract_controller/helpers.rb b/actionpack/lib/abstract_controller/helpers.rb index 3913259ecc..abb09456e0 100644 --- a/actionpack/lib/abstract_controller/helpers.rb +++ b/actionpack/lib/abstract_controller/helpers.rb @@ -7,7 +7,7 @@ module AbstractController extend ActiveSupport::Concern included do - class_attribute :_helpers, default: Module.new + class_attribute :_helpers, default: define_helpers_module(self) class_attribute :_helper_methods, default: Array.new end @@ -31,7 +31,7 @@ module AbstractController # independently of the child class's. def inherited(klass) helpers = _helpers - klass._helpers = Module.new { include helpers } + klass._helpers = define_helpers_module(klass, helpers) klass.class_eval { default_helper_module! } unless klass.anonymous? super end @@ -61,12 +61,17 @@ module AbstractController meths.flatten! self._helper_methods += meths + location = caller_locations(1, 1).first + file, line = location.path, location.lineno + meths.each do |meth| - _helpers.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1 - def #{meth}(*args, &blk) # def current_user(*args, &blk) - controller.send(%(#{meth}), *args, &blk) # controller.send(:current_user, *args, &blk) - end # end - ruby_eval + method_def = [ + "def #{meth}(*args, &blk)", + " controller.send(%(#{meth}), *args, &blk)", + "end" + ].join(";") + + _helpers.class_eval method_def, file, line end end @@ -170,6 +175,17 @@ module AbstractController end private + def define_helpers_module(klass, helpers = nil) + # In some tests inherited is called explicitly. In that case, just + # return the module from the first time it was defined + return klass.const_get(:HelperMethods) if klass.const_defined?(:HelperMethods, false) + + mod = Module.new + klass.const_set(:HelperMethods, mod) + mod.include(helpers) if helpers + mod + end + # Makes all the (instance) methods in the helper module available to templates # rendered through this controller. # |