Merge pull request #41464 from p8/deprecate-ivars-locals-in-render-partial

Deprecate render locals to be assigned to instance variables
This commit is contained in:
Rafael França 2021-02-16 14:24:59 -05:00 committed by GitHub
commit fe912cb1a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 1 deletions

View File

@ -1,3 +1,7 @@
* Deprecate `render` locals to be assigned to instance variables.
*Petrik de Heus*
* Remove legacy default `media=screen` from `stylesheet_link_tag`.
*André Luis Leal Cardoso Junior*

View File

@ -319,6 +319,13 @@ module ActionView
# Only locals with valid variable names get set directly. Others will
# still be available in local_assigns.
locals = @locals - Module::RUBY_RESERVED_KEYWORDS
deprecated_locals = locals.grep(/\A@+/)
if deprecated_locals.any?
ActiveSupport::Deprecation.warn(<<~MSG)
Passing instance variables to `render` is deprecated.
In Rails 7.0, #{deprecated_locals.to_sentence} will be ignored.
MSG
end
locals = locals.grep(/\A@?(?![A-Z0-9])(?:[[:alnum:]_]|[^\0-\177])+\z/)
# Assign for the same variable is to suppress unused variable warning

View File

@ -52,8 +52,11 @@ class CompiledTemplatesTest < ActiveSupport::TestCase
end
def test_template_with_instance_variable_identifier
expected_deprecation = "In Rails 7.0, @foo will be ignored."
assert_deprecated(expected_deprecation) do
assert_equal "bar", render(template: "test/render_file_instance_variable", locals: { "@foo": "bar" })
end
end
def test_template_gets_recompiled_when_using_different_keys_in_local_assigns
assert_equal "one", render(template: "test/render_file_with_locals_and_default")