File tree Expand file tree Collapse file tree 6 files changed +43
-2
lines changed
test/controller/parameters
generators/rails/app/templates/config/initializers Expand file tree Collapse file tree 6 files changed +43
-2
lines changed Original file line number Diff line number Diff line change @@ -234,6 +234,8 @@ class Parameters
234
234
# config.action_controller.always_permitted_parameters = %w( controller action format )
235
235
cattr_accessor :always_permitted_parameters , default : %w( controller action )
236
236
237
+ cattr_accessor :allow_deprecated_parameters_hash_equality , default : true , instance_accessor : false
238
+
237
239
class << self
238
240
def nested_attribute? ( key , value ) # :nodoc:
239
241
/\A -?\d +\z / . match? ( key ) && ( value . is_a? ( Hash ) || value . is_a? ( Parameters ) )
@@ -268,13 +270,15 @@ def ==(other)
268
270
if other . respond_to? ( :permitted? )
269
271
permitted? == other . permitted? && parameters == other . parameters
270
272
else
271
- if Hash === other
273
+ if self . class . allow_deprecated_parameters_hash_equality && Hash === other
272
274
ActiveSupport ::Deprecation . warn <<-WARNING . squish
273
275
Comparing equality between `ActionController::Parameters` and a
274
276
`Hash` is deprecated and will be removed in Rails 7.2. Please only do
275
277
comparisons between instances of `ActionController::Parameters`. If
276
278
you need to compare to a hash, first convert it using
277
279
`ActionController::Parameters#new`.
280
+ To disable the deprecated behaviour set
281
+ `Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality = false`.
278
282
WARNING
279
283
@parameters == other
280
284
else
Original file line number Diff line number Diff line change @@ -42,6 +42,11 @@ class Railtie < Rails::Railtie # :nodoc:
42
42
end
43
43
44
44
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
45
50
end
46
51
end
47
52
@@ -72,7 +77,8 @@ class Railtie < Rails::Railtie # :nodoc:
72
77
:permit_all_parameters ,
73
78
:action_on_unpermitted_parameters ,
74
79
:always_permitted_parameters ,
75
- :wrap_parameters_by_default
80
+ :wrap_parameters_by_default ,
81
+ :allow_deprecated_parameters_hash_equality
76
82
)
77
83
78
84
filtered_options . each do |k , v |
Original file line number Diff line number Diff line change 6
6
class ParametersAccessorsTest < ActiveSupport ::TestCase
7
7
setup do
8
8
ActionController ::Parameters . permit_all_parameters = false
9
+ ActionController ::Parameters . allow_deprecated_parameters_hash_equality = true
9
10
10
11
@params = ActionController ::Parameters . new (
11
12
person : {
@@ -104,6 +105,15 @@ class ParametersAccessorsTest < ActiveSupport::TestCase
104
105
end
105
106
end
106
107
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
+
107
117
test "each_value carries permitted status" do
108
118
@params . permit!
109
119
@params . each_value do |value |
Original file line number Diff line number Diff line change @@ -64,6 +64,7 @@ Below are the default values associated with each target version. In cases of co
64
64
- [ ` config.add_autoload_paths_to_load_path ` ] ( #config-add-autoload-paths-to-load-path ) : ` false `
65
65
- [ ` config.active_support.default_message_encryptor_serializer ` ] ( #config-active-support-default-message-encryptor-serializer ) : ` :json `
66
66
- [ ` 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 `
67
68
68
69
#### Default Values for Target Version 7.0
69
70
@@ -1155,6 +1156,18 @@ The default value depends on the `config.load_defaults` target version:
1155
1156
Configures the [`ParamsWrapper`](https://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html). This can be called at
1156
1157
the top level, or on individual controllers.
1157
1158
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
+
1158
1171
### Configuring Action Dispatch
1159
1172
1160
1173
#### `config.action_dispatch.cookies_serializer`
Original file line number Diff line number Diff line change @@ -274,6 +274,10 @@ def load_defaults(target_version)
274
274
active_support . default_message_encryptor_serializer = :json
275
275
active_support . default_message_verifier_serializer = :json
276
276
end
277
+
278
+ if respond_to? ( :action_controller )
279
+ action_controller . allow_deprecated_parameters_hash_equality = false
280
+ end
277
281
else
278
282
raise "Unknown version #{ target_version . to_s . inspect } "
279
283
end
Original file line number Diff line number Diff line change 24
24
# "X-Permitted-Cross-Domain-Policies" => "none",
25
25
# "Referrer-Policy" => "strict-origin-when-cross-origin"
26
26
# }
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
You can’t perform that action at this time.
0 commit comments