Skip to content

Commit f3d96c2

Browse files
authored
Merge pull request rails#50665 from seanpdoyle/action-view-renderable-argument-error
Raise `ArgumentError` if `:renderable` object does not respond to `#render_in`
2 parents ba2603a + b3bb06a commit f3d96c2

File tree

4 files changed

+24
-3
lines changed

4 files changed

+24
-3
lines changed

actionview/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
* Raise `ArgumentError` if `:renderable` object does not respond to `#render_in`
2+
3+
*Sean Doyle*
4+
15
* Add the `nonce: true` option for `stylesheet_link_tag` helper to support automatic nonce generation for Content Security Policy.
26
Works the same way as `javascript_include_tag nonce: true` does.
37

actionview/lib/action_view/renderer/abstract_renderer.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def partial_path(object, view)
7979
path = if object.respond_to?(:to_partial_path)
8080
object.to_partial_path
8181
else
82-
raise ArgumentError.new("'#{object.inspect}' is not an ActiveModel-compatible object. It must implement :to_partial_path.")
82+
raise ArgumentError.new("'#{object.inspect}' is not an ActiveModel-compatible object. It must implement #to_partial_path.")
8383
end
8484

8585
if view.prefix_partial_path_with_controller_namespace

actionview/lib/action_view/template/renderable.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ 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."
1719
end
1820

1921
def format

actionview/test/template/render_test.rb

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,8 +293,23 @@ def test_render_partial_with_missing_filename
293293
end
294294

295295
def test_render_partial_with_incompatible_object
296-
e = assert_raises(ArgumentError) { @view.render(partial: nil) }
297-
assert_equal "'#{nil.inspect}' is not an ActiveModel-compatible object. It must implement :to_partial_path.", e.message
296+
assert_raises ArgumentError, match: "'#{nil.inspect}' is not an ActiveModel-compatible object. It must implement #to_partial_path." do
297+
@view.render(partial: nil)
298+
end
299+
end
300+
301+
def test_render_renderable_with_nil
302+
assert_raises ArgumentError, match: "'#{nil.inspect}' is not a renderable object. It must implement #render_in." do
303+
@view.render renderable: nil
304+
end
305+
end
306+
307+
def test_render_renderable_with_incompatible_object
308+
object = Object.new
309+
310+
assert_raises ArgumentError, match: "'#{object.inspect}' is not a renderable object. It must implement #render_in." do
311+
@view.render renderable: object
312+
end
298313
end
299314

300315
def test_render_partial_starting_with_a_capital

0 commit comments

Comments
 (0)