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
methods.each do |method|
_helpers_for_modification.class_eval <<~ruby_eval, file, line
def #{method}(*args, &block) # def current_user(*args, &block)
controller.send(:'#{method}', *args, &block) # controller.send(:'current_user', *args, &block)
end # end
# def current_user(*args, &block)
# controller.send(:'current_user', *args, &block)
# 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}')
ruby_eval
end

View File

@ -98,6 +98,9 @@ class HelperTest < ActiveSupport::TestCase
def delegate_method() end
def delegate_method_arg(arg); arg; end
def delegate_method_kwarg(hi:); hi; end
def method_that_raises
raise "an error occurred"
end
end
def setup
@ -145,6 +148,16 @@ class HelperTest < ActiveSupport::TestCase
assert_equal(:there, @controller_class.new.helpers.delegate_method_kwarg(hi: :there))
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
assert_nothing_raised { @controller_class.helper_attr :delegate_attr }
assert_includes master_helper_methods, :delegate_attr