Fix incorrect line number if a `helper_method` errors

Currently if you use `helper_method` to define a method, and inside that method you get an error, the backtrace is off by one line.

This PR fixes that so that the backtrace now points to the line where you called `helper_method`.
This commit is contained in:
Alex Ghiculescu 2022-05-17 10:22:08 -05:00
parent fe8d41eda1
commit 203032dd76
2 changed files with 20 additions and 4 deletions

View File

@ -84,10 +84,13 @@ module AbstractController
file, line = location.path, location.lineno file, line = location.path, location.lineno
methods.each do |method| methods.each do |method|
_helpers_for_modification.class_eval <<~ruby_eval, file, line # def current_user(*args, &block)
def #{method}(*args, &block) # def current_user(*args, &block) # controller.send(:'current_user', *args, &block)
controller.send(:'#{method}', *args, &block) # controller.send(:'current_user', *args, &block) # end
end # end _helpers_for_modification.class_eval <<~ruby_eval.lines.map(&:strip).join(";"), file, line
def #{method}(*args, &block)
controller.send(:'#{method}', *args, &block)
end
ruby2_keywords(:'#{method}') ruby2_keywords(:'#{method}')
ruby_eval ruby_eval
end end

View File

@ -98,6 +98,9 @@ class HelperTest < ActiveSupport::TestCase
def delegate_method() end def delegate_method() end
def delegate_method_arg(arg); arg; end def delegate_method_arg(arg); arg; end
def delegate_method_kwarg(hi:); hi; end def delegate_method_kwarg(hi:); hi; end
def method_that_raises
raise "an error occurred"
end
end end
def setup def setup
@ -145,6 +148,16 @@ class HelperTest < ActiveSupport::TestCase
assert_equal(:there, @controller_class.new.helpers.delegate_method_kwarg(hi: :there)) assert_equal(:there, @controller_class.new.helpers.delegate_method_kwarg(hi: :there))
end end
def test_helper_method_with_error_has_correct_backgrace
@controller_class.helper_method :method_that_raises
expected_backtrace_pattern = "#{__FILE__}:#{__LINE__ - 1}"
error = assert_raises(RuntimeError) do
@controller_class.new.helpers.method_that_raises
end
assert_not_nil error.backtrace.find { |line| line.include?(expected_backtrace_pattern) }
end
def test_helper_attr def test_helper_attr
assert_nothing_raised { @controller_class.helper_attr :delegate_attr } assert_nothing_raised { @controller_class.helper_attr :delegate_attr }
assert_includes master_helper_methods, :delegate_attr assert_includes master_helper_methods, :delegate_attr