Skip to content

Commit cfa7284

Browse files
authored
Merge pull request rails#44826 from stefkin/acp-eql-flag
Add a flag to disable deprecated AC::Parameters comparison
2 parents 313dd2e + 67762c2 commit cfa7284

File tree

6 files changed

+43
-2
lines changed

6 files changed

+43
-2
lines changed

actionpack/lib/action_controller/metal/strong_parameters.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@ class Parameters
234234
# config.action_controller.always_permitted_parameters = %w( controller action format )
235235
cattr_accessor :always_permitted_parameters, default: %w( controller action )
236236

237+
cattr_accessor :allow_deprecated_parameters_hash_equality, default: true, instance_accessor: false
238+
237239
class << self
238240
def nested_attribute?(key, value) # :nodoc:
239241
/\A-?\d+\z/.match?(key) && (value.is_a?(Hash) || value.is_a?(Parameters))
@@ -268,13 +270,15 @@ def ==(other)
268270
if other.respond_to?(:permitted?)
269271
permitted? == other.permitted? && parameters == other.parameters
270272
else
271-
if Hash === other
273+
if self.class.allow_deprecated_parameters_hash_equality && Hash === other
272274
ActiveSupport::Deprecation.warn <<-WARNING.squish
273275
Comparing equality between `ActionController::Parameters` and a
274276
`Hash` is deprecated and will be removed in Rails 7.2. Please only do
275277
comparisons between instances of `ActionController::Parameters`. If
276278
you need to compare to a hash, first convert it using
277279
`ActionController::Parameters#new`.
280+
To disable the deprecated behaviour set
281+
`Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality = false`.
278282
WARNING
279283
@parameters == other
280284
else

actionpack/lib/action_controller/railtie.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ class Railtie < Rails::Railtie # :nodoc:
4242
end
4343

4444
ActionController::Parameters.action_on_unpermitted_parameters = action_on_unpermitted_parameters
45+
46+
unless options.allow_deprecated_parameters_hash_equality.nil?
47+
ActionController::Parameters.allow_deprecated_parameters_hash_equality =
48+
options.allow_deprecated_parameters_hash_equality
49+
end
4550
end
4651
end
4752

@@ -72,7 +77,8 @@ class Railtie < Rails::Railtie # :nodoc:
7277
:permit_all_parameters,
7378
:action_on_unpermitted_parameters,
7479
:always_permitted_parameters,
75-
:wrap_parameters_by_default
80+
:wrap_parameters_by_default,
81+
:allow_deprecated_parameters_hash_equality
7682
)
7783

7884
filtered_options.each do |k, v|

actionpack/test/controller/parameters/accessors_test.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
class ParametersAccessorsTest < ActiveSupport::TestCase
77
setup do
88
ActionController::Parameters.permit_all_parameters = false
9+
ActionController::Parameters.allow_deprecated_parameters_hash_equality = true
910

1011
@params = ActionController::Parameters.new(
1112
person: {
@@ -104,6 +105,15 @@ class ParametersAccessorsTest < ActiveSupport::TestCase
104105
end
105106
end
106107

108+
test "deprecated comparison disabled" do
109+
ActionController::Parameters.allow_deprecated_parameters_hash_equality = false
110+
111+
assert_kind_of Enumerator, @params.each_pair
112+
assert_not_deprecated do
113+
assert_not_equal @params, @params.each_pair.to_h
114+
end
115+
end
116+
107117
test "each_value carries permitted status" do
108118
@params.permit!
109119
@params.each_value do |value|

guides/source/configuring.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ Below are the default values associated with each target version. In cases of co
6464
- [`config.add_autoload_paths_to_load_path`](#config-add-autoload-paths-to-load-path): `false`
6565
- [`config.active_support.default_message_encryptor_serializer`](#config-active-support-default-message-encryptor-serializer): `:json`
6666
- [`config.active_support.default_message_verifier_serializer`](#config-active-support-default-message-verifier-serializer): `:json`
67+
- [`config.action_controller.allow_deprecated_parameters_hash_equality`](#config-action-controller-allow-deprecated-parameters-hash-equality): `false`
6768

6869
#### Default Values for Target Version 7.0
6970

@@ -1155,6 +1156,18 @@ The default value depends on the `config.load_defaults` target version:
11551156
Configures the [`ParamsWrapper`](https://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html). This can be called at
11561157
the top level, or on individual controllers.
11571158
1159+
#### `config.action_controller.allow_deprecated_parameters_hash_equality`
1160+
1161+
Controls behaviour of `ActionController::Parameters#==` with `Hash` arguments.
1162+
Value of the setting determines whether an `ActionController::Parameters` instance is equal to an equivalent `Hash`.
1163+
1164+
The default value depends on the `config.load_defaults` target version:
1165+
1166+
| Starting with version | The default value is |
1167+
| --------------------- | -------------------- |
1168+
| (original) | `true` |
1169+
| 7.1 | `false` |
1170+
11581171
### Configuring Action Dispatch
11591172
11601173
#### `config.action_dispatch.cookies_serializer`

railties/lib/rails/application/configuration.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,10 @@ def load_defaults(target_version)
274274
active_support.default_message_encryptor_serializer = :json
275275
active_support.default_message_verifier_serializer = :json
276276
end
277+
278+
if respond_to?(:action_controller)
279+
action_controller.allow_deprecated_parameters_hash_equality = false
280+
end
277281
else
278282
raise "Unknown version #{target_version.to_s.inspect}"
279283
end

railties/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_1.rb.tt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,7 @@
2424
# "X-Permitted-Cross-Domain-Policies" => "none",
2525
# "Referrer-Policy" => "strict-origin-when-cross-origin"
2626
# }
27+
28+
# Do not treat an `ActionController::Parameters` instance
29+
# as equal to an equivalent `Hash` by default.
30+
# Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality = false

0 commit comments

Comments
 (0)