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:
commit
08e97650d6
2 changed files with 25 additions and 9 deletions
|
@ -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.
|
||||
#
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue