1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Merge pull request #36399 from jhawthorn/named_controller_helper_module

Name helper_method module and improve source location
This commit is contained in:
John Hawthorn 2019-06-05 08:20:50 -07:00 committed by GitHub
commit 08e97650d6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 9 deletions

View file

@ -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.
#

View file

@ -150,8 +150,8 @@ class HelperTest < ActiveSupport::TestCase
end
def test_default_helpers_only
assert_equal [JustMeHelper], JustMeController._helpers.ancestors.reject(&:anonymous?)
assert_equal [MeTooHelper, JustMeHelper], MeTooController._helpers.ancestors.reject(&:anonymous?)
assert_equal %w[JustMeHelper], JustMeController._helpers.ancestors.reject(&:anonymous?).map(&:to_s)
assert_equal %w[MeTooController::HelperMethods MeTooHelper JustMeHelper], MeTooController._helpers.ancestors.reject(&:anonymous?).map(&:to_s)
end
def test_base_helper_methods_after_clear_helpers