Skip to content

Commit 952a13b

Browse files
Do not mask NoMethodError from within render_in
Follow-up to rails#50665. Unconditionally converting `NoMethodError` to `ArgumentError` can mask a legitimate `NoMethodError` from within the `render_in` method. This commit adds a check to prevent that.
1 parent 75ba520 commit 952a13b

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

actionview/lib/action_view/template/renderable.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,12 @@ def identifier
1414

1515
def render(context, *args)
1616
@renderable.render_in(context)
17-
rescue NoMethodError
18-
raise ArgumentError, "'#{@renderable.inspect}' is not a renderable object. It must implement #render_in."
17+
rescue NoMethodError => error
18+
if error.name == :render_in
19+
raise ArgumentError, "'#{@renderable.inspect}' is not a renderable object. It must implement #render_in."
20+
else
21+
raise
22+
end
1923
end
2024

2125
def format

actionview/test/template/render_test.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,15 @@ def test_render_renderable_with_incompatible_object
312312
end
313313
end
314314

315+
def test_render_renderable_does_not_mask_nomethoderror_from_within_render_in
316+
renderable = Object.new
317+
renderable.define_singleton_method(:render_in) { |*| nil.foo }
318+
319+
assert_raises NoMethodError, match: "undefined method `foo' for nil" do
320+
@view.render renderable: renderable
321+
end
322+
end
323+
315324
def test_render_partial_starting_with_a_capital
316325
assert_nothing_raised { @view.render(partial: "test/FooBar") }
317326
end

0 commit comments

Comments
 (0)