actionpack 7.2.3.1 → 8.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +194 -120
  3. data/lib/abstract_controller/rendering.rb +0 -1
  4. data/lib/action_controller/base.rb +1 -1
  5. data/lib/action_controller/form_builder.rb +3 -3
  6. data/lib/action_controller/metal/allow_browser.rb +11 -1
  7. data/lib/action_controller/metal/conditional_get.rb +5 -1
  8. data/lib/action_controller/metal/data_streaming.rb +4 -2
  9. data/lib/action_controller/metal/instrumentation.rb +1 -2
  10. data/lib/action_controller/metal/live.rb +58 -10
  11. data/lib/action_controller/metal/rate_limiting.rb +13 -4
  12. data/lib/action_controller/metal/renderers.rb +2 -3
  13. data/lib/action_controller/metal/streaming.rb +5 -84
  14. data/lib/action_controller/metal/strong_parameters.rb +277 -89
  15. data/lib/action_controller/railtie.rb +6 -7
  16. data/lib/action_controller/test_case.rb +12 -2
  17. data/lib/action_dispatch/http/cache.rb +27 -10
  18. data/lib/action_dispatch/http/content_security_policy.rb +14 -1
  19. data/lib/action_dispatch/http/param_builder.rb +186 -0
  20. data/lib/action_dispatch/http/param_error.rb +26 -0
  21. data/lib/action_dispatch/http/permissions_policy.rb +2 -0
  22. data/lib/action_dispatch/http/query_parser.rb +53 -0
  23. data/lib/action_dispatch/http/request.rb +60 -16
  24. data/lib/action_dispatch/http/response.rb +34 -13
  25. data/lib/action_dispatch/journey/parser.rb +99 -196
  26. data/lib/action_dispatch/journey/scanner.rb +44 -42
  27. data/lib/action_dispatch/middleware/cookies.rb +4 -2
  28. data/lib/action_dispatch/middleware/debug_exceptions.rb +17 -4
  29. data/lib/action_dispatch/middleware/debug_view.rb +0 -5
  30. data/lib/action_dispatch/middleware/exception_wrapper.rb +0 -6
  31. data/lib/action_dispatch/middleware/request_id.rb +2 -1
  32. data/lib/action_dispatch/middleware/ssl.rb +13 -3
  33. data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +0 -3
  34. data/lib/action_dispatch/railtie.rb +8 -0
  35. data/lib/action_dispatch/request/session.rb +1 -0
  36. data/lib/action_dispatch/request/utils.rb +9 -3
  37. data/lib/action_dispatch/routing/inspector.rb +1 -1
  38. data/lib/action_dispatch/routing/mapper.rb +91 -62
  39. data/lib/action_dispatch/routing/polymorphic_routes.rb +2 -2
  40. data/lib/action_dispatch/routing/route_set.rb +21 -10
  41. data/lib/action_dispatch/routing/routes_proxy.rb +1 -0
  42. data/lib/action_dispatch/system_testing/browser.rb +12 -21
  43. data/lib/action_dispatch/testing/assertions/response.rb +12 -2
  44. data/lib/action_dispatch/testing/assertions/routing.rb +16 -12
  45. data/lib/action_dispatch/testing/integration.rb +18 -7
  46. data/lib/action_dispatch.rb +6 -4
  47. data/lib/action_pack/gem_version.rb +4 -4
  48. metadata +14 -47
  49. data/lib/action_dispatch/journey/parser.y +0 -50
  50. data/lib/action_dispatch/journey/parser_extras.rb +0 -33
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f632afaf7276803c12ae1982dea2f181773d3cd0c8aece77746c30ab2fea034
4
- data.tar.gz: '0850461c63c8f120819bd46ee69a293174ebd6eaa24d04553a02114978055c9c'
3
+ metadata.gz: 2effaa8c37f91de6cda898c8ebb9857da735e8c2064c46473f4bd52caa70466c
4
+ data.tar.gz: c42b8c6737bce6b429ea71f66a86fcdc7cd468887c110829b527296d253adbd5
5
5
  SHA512:
6
- metadata.gz: 5bde81c0c852642c34f6b00e34b9d405c005cab6999939530204e015ac3c2c2f0dcecffc6318aa96278f0431f4e9ab9d680058c7276067404aea028a538298a6
7
- data.tar.gz: c0dad94620adb34c30bb106d188bbb5a4b22883b05fc677f7d6ece653579cf8c92e15d42f8b4b9ef15f63512be0af30a22ee941ba600a0e68cc78265f9e48f45
6
+ metadata.gz: 8b23a24307dd4d5ffb5d2ac31618809026d8b9620b27382a7b23d321648796b45f6e90d199117b4cc69b39db4d6558ad3dbef075ce5e5543043c57ae5f5cda25
7
+ data.tar.gz: ace10e1524236d4cb72929262e3222c35a09a7abad52bc86b49abf979331261bdbd8860723afe96bc7e98e5a819b5cd62a1fd42f6ce7e31039b399facb61c409
data/CHANGELOG.md CHANGED
@@ -1,14 +1,54 @@
1
- ## Rails 7.2.3.1 (March 23, 2026) ##
1
+ ## Rails 8.0.5 (March 24, 2026) ##
2
+
3
+ * Add `config.action_controller.live_streaming_excluded_keys` to control execution state sharing in ActionController::Live.
4
+
5
+ When using ActionController::Live, actions are executed in a separate thread that shares
6
+ state from the parent thread. This new configuration allows applications to opt-out specific
7
+ state keys that should not be shared.
8
+
9
+ This is useful when streaming inside a `connected_to` block, where you may want
10
+ the streaming thread to use its own database connection context.
11
+
12
+ ```ruby
13
+ # config/application.rb
14
+ config.action_controller.live_streaming_excluded_keys = [:active_record_connected_to_stack]
15
+ ```
16
+
17
+ By default, all keys are shared.
18
+
19
+ *Eileen M. Uchitelle*
20
+
21
+
22
+ ## Rails 8.0.4.1 (March 23, 2026) ##
2
23
 
3
24
  * No changes.
4
25
 
5
26
 
6
- ## Rails 7.2.3 (October 28, 2025) ##
27
+ ## Rails 8.0.4 (October 28, 2025) ##
7
28
 
8
29
  * Submit test requests using `as: :html` with `Content-Type: x-www-form-urlencoded`
9
30
 
10
31
  *Sean Doyle*
11
32
 
33
+
34
+ ## Rails 8.0.3 (September 22, 2025) ##
35
+
36
+ * URL helpers for engines mounted at the application root handle `SCRIPT_NAME` correctly.
37
+
38
+ Fixed an issue where `SCRIPT_NAME` is not applied to paths generated for routes in an engine
39
+ mounted at "/".
40
+
41
+ *Mike Dalessio*
42
+
43
+ * Fix `Rails.application.reload_routes!` from clearing almost all routes.
44
+
45
+ When calling `Rails.application.reload_routes!` inside a middleware of
46
+ a Rake task, it was possible under certain conditions that all routes would be cleared.
47
+ If ran inside a middleware, this would result in getting a 404 on most page you visit.
48
+ This issue was only happening in development.
49
+
50
+ *Edouard Chin*
51
+
12
52
  * Address `rack 3.2` deprecations warnings.
13
53
 
14
54
  ```
@@ -16,10 +56,14 @@
16
56
  Please use :unprocessable_content instead.
17
57
  ```
18
58
 
19
- Rails API will transparently convert one into the other for the forseable future.
59
+ Rails API will transparently convert one into the other for the foreseeable future.
20
60
 
21
61
  *Earlopain*, *Jean Boussier*
22
62
 
63
+ * Support hash-source in Content Security Policy.
64
+
65
+ *madogiwa*
66
+
23
67
  * Always return empty body for HEAD requests in `PublicExceptions` and
24
68
  `DebugExceptions`.
25
69
 
@@ -27,218 +71,248 @@
27
71
 
28
72
  *Hartley McGuire*
29
73
 
30
- * Fix `url_for` to handle `:path_params` gracefully when it's not a `Hash`.
31
-
32
- Prevents various security scanners from causing exceptions.
33
74
 
34
- *Martin Emde*
75
+ ## Rails 8.0.2.1 (August 13, 2025) ##
35
76
 
36
- * Fix `ActionDispatch::Executor` to unwrap exceptions like other error reporting middlewares.
77
+ * No changes.
37
78
 
38
- *Jean Boussier*
79
+ ## Rails 8.0.2 (March 12, 2025) ##
39
80
 
40
- * Fix NoMethodError when a non-string CSRF token is passed through headers.
81
+ * Improve `with_routing` test helper to not rebuild the middleware stack.
41
82
 
42
- *Ryan Heneise*
83
+ Otherwise some middleware configuration could be lost.
43
84
 
44
- * Fix invalid response when rescuing `ActionController::Redirecting::UnsafeRedirectError` in a controller.
85
+ *Édouard Chin*
45
86
 
46
- *Alex Ghiculescu*
87
+ * Add resource name to the `ArgumentError` that's raised when invalid `:only` or `:except` options are given to `#resource` or `#resources`
47
88
 
89
+ This makes it easier to locate the source of the problem, especially for routes drawn by gems.
48
90
 
49
- ## Rails 7.2.2.2 (August 13, 2025) ##
91
+ Before:
92
+ ```
93
+ :only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]
94
+ ```
50
95
 
51
- * No changes.
96
+ After:
97
+ ```
98
+ Route `resources :products` - :only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]
99
+ ```
52
100
 
101
+ *Jeremy Green*
53
102
 
54
- ## Rails 7.2.2.1 (December 10, 2024) ##
103
+ * Fix `url_for` to handle `:path_params` gracefully when it's not a `Hash`.
55
104
 
56
- * Add validation to content security policies to disallow spaces and semicolons.
57
- Developers should use multiple arguments, and different directive methods instead.
105
+ Prevents various security scanners from causing exceptions.
58
106
 
59
- [CVE-2024-54133]
107
+ *Martin Emde*
60
108
 
61
- *Gannon McGibbon*
109
+ * Fix `ActionDispatch::Executor` to unwrap exceptions like other error reporting middlewares.
62
110
 
111
+ *Jean Boussier*
63
112
 
64
- ## Rails 7.2.2 (October 30, 2024) ##
65
113
 
66
- * Fix non-GET requests not updating cookies in `ActionController::TestCase`.
114
+ ## Rails 8.0.1 (December 13, 2024) ##
67
115
 
68
- *Jon Moss*, *Hartley McGuire*
116
+ * Add `ActionDispatch::Request::Session#store` method to conform Rack spec.
69
117
 
118
+ *Yaroslav*
70
119
 
71
- ## Rails 7.2.1.2 (October 23, 2024) ##
72
120
 
73
- * No changes.
121
+ ## Rails 8.0.0.1 (December 10, 2024) ##
74
122
 
123
+ * Add validation to content security policies to disallow spaces and semicolons.
124
+ Developers should use multiple arguments, and different directive methods instead.
75
125
 
76
- ## Rails 7.2.1.1 (October 15, 2024) ##
126
+ [CVE-2024-54133]
77
127
 
78
- * Avoid regex backtracking in HTTP Token authentication
128
+ *Gannon McGibbon*
79
129
 
80
- [CVE-2024-47887]
81
130
 
82
- *John Hawthorn*
131
+ ## Rails 8.0.0 (November 07, 2024) ##
83
132
 
84
- * Avoid regex backtracking in query parameter filtering
133
+ * No changes.
85
134
 
86
- [CVE-2024-41128]
87
135
 
88
- *John Hawthorn*
136
+ ## Rails 8.0.0.rc2 (October 30, 2024) ##
89
137
 
138
+ * Fix routes with `::` in the path.
90
139
 
91
- ## Rails 7.2.1 (August 22, 2024) ##
140
+ *Rafael Mendonça França*
92
141
 
93
- * Fix `Request#raw_post` raising `NoMethodError` when `rack.input` is `nil`.
142
+ * Maintain Rack 2 parameter parsing behaviour.
94
143
 
95
- *Hartley McGuire*
144
+ *Matthew Draper*
96
145
 
97
146
 
98
- ## Rails 7.2.0 (August 09, 2024) ##
147
+ ## Rails 8.0.0.rc1 (October 19, 2024) ##
99
148
 
100
- * Allow bots to ignore `allow_browser`.
149
+ * Remove `Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality`.
101
150
 
102
- *Matthew Nguyen*
151
+ *Rafael Mendonça França*
103
152
 
104
- * Include the HTTP Permissions-Policy on non-HTML Content-Types
105
- [CVE-2024-28103]
153
+ * Improve `ActionController::TestCase` to expose a binary encoded `request.body`.
106
154
 
107
- *Aaron Patterson*, *Zack Deveau*
155
+ The rack spec clearly states:
108
156
 
109
- * Fix `Mime::Type.parse` handling type parameters for HTTP Accept headers.
157
+ > The input stream is an IO-like object which contains the raw HTTP POST data.
158
+ > When applicable, its external encoding must be “ASCII-8BIT” and it must be opened in binary mode.
110
159
 
111
- *Taylor Chaparro*
160
+ Until now its encoding was generally UTF-8, which doesn't accurately reflect production
161
+ behavior.
112
162
 
113
- * Fix the error page that is displayed when a view template is missing to account for nested controller paths in the
114
- suggested correct location for the missing template.
163
+ *Jean Boussier*
115
164
 
116
- *Joshua Young*
165
+ * Update `ActionController::AllowBrowser` to support passing method names to `:block`
117
166
 
118
- * Add `save_and_open_page` helper to `IntegrationTest`.
167
+ ```ruby
168
+ class ApplicationController < ActionController::Base
169
+ allow_browser versions: :modern, block: :handle_outdated_browser
119
170
 
120
- `save_and_open_page` is a helpful helper to keep a short feedback loop when working on system tests.
121
- A similar helper with matching signature has been added to integration tests.
171
+ private
172
+ def handle_outdated_browser
173
+ render file: Rails.root.join("public/custom-error.html"), status: :not_acceptable
174
+ end
175
+ end
176
+ ```
122
177
 
123
- *Joé Dupuis*
178
+ *Sean Doyle*
124
179
 
125
- * Fix a regression in 7.1.3 passing a `to:` option without a controller when the controller is already defined by a scope.
180
+ * Raise an `ArgumentError` when invalid `:only` or `:except` options are passed into `#resource` and `#resources`.
126
181
 
127
- ```ruby
128
- Rails.application.routes.draw do
129
- controller :home do
130
- get "recent", to: "recent_posts"
131
- end
132
- end
133
- ```
182
+ *Joshua Young*
134
183
 
135
- *Étienne Barrié*
184
+ ## Rails 8.0.0.beta1 (September 26, 2024) ##
136
185
 
137
- * Request Forgery takes relative paths into account.
186
+ * Fix non-GET requests not updating cookies in `ActionController::TestCase`.
138
187
 
139
- *Stefan Wienert*
188
+ *Jon Moss*, *Hartley McGuire*
140
189
 
141
- * Add ".test" as a default allowed host in development to ensure smooth golden-path setup with puma.dev.
190
+ * Update `ActionController::Live` to use a thread-pool to reuse threads across requests.
142
191
 
143
- *DHH*
192
+ *Adam Renberg Tamm*
144
193
 
145
- * Add `allow_browser` to set minimum browser versions for the application.
194
+ * Introduce safer, more explicit params handling method with `params#expect` such that
195
+ `params.expect(table: [ :attr ])` replaces `params.require(:table).permit(:attr)`
146
196
 
147
- A browser that's blocked will by default be served the file in `public/406-unsupported-browser.html` with a HTTP status code of "406 Not Acceptable".
197
+ Ensures params are filtered with consideration for the expected
198
+ types of values, improving handling of params and avoiding ignorable
199
+ errors caused by params tampering.
148
200
 
149
201
  ```ruby
150
- class ApplicationController < ActionController::Base
151
- # Allow only browsers natively supporting webp images, web push, badges, import maps, CSS nesting + :has
152
- allow_browser versions: :modern
153
- end
202
+ # If the url is altered to ?person=hacked
203
+ # Before
204
+ params.require(:person).permit(:name, :age, pets: [:name])
205
+ # raises NoMethodError, causing a 500 and potential error reporting
206
+
207
+ # After
208
+ params.expect(person: [ :name, :age, pets: [[:name]] ])
209
+ # raises ActionController::ParameterMissing, correctly returning a 400 error
210
+ ```
154
211
 
155
- class ApplicationController < ActionController::Base
156
- # All versions of Chrome and Opera will be allowed, but no versions of "internet explorer" (ie). Safari needs to be 16.4+ and Firefox 121+.
157
- allow_browser versions: { safari: 16.4, firefox: 121, ie: false }
158
- end
212
+ You may also notice the new double array `[[:name]]`. In order to
213
+ declare when a param is expected to be an array of parameter hashes,
214
+ this new double array syntax is used to explicitly declare an array.
215
+ `expect` requires you to declare expected arrays in this way, and will
216
+ ignore arrays that are passed when, for example, `pet: [:name]` is used.
159
217
 
160
- class MessagesController < ApplicationController
161
- # In addition to the browsers blocked by ApplicationController, also block Opera below 104 and Chrome below 119 for the show action.
162
- allow_browser versions: { opera: 104, chrome: 119 }, only: :show
163
- end
164
- ```
218
+ In order to preserve compatibility, `permit` does not adopt the new
219
+ double array syntax and is therefore more permissive about unexpected
220
+ types. Using `expect` everywhere is recommended.
165
221
 
166
- *DHH*
222
+ We suggest replacing `params.require(:person).permit(:name, :age)`
223
+ with the direct replacement `params.expect(person: [:name, :age])`
224
+ to prevent external users from manipulating params to trigger 500
225
+ errors. A 400 error will be returned instead, using public/400.html
167
226
 
168
- * Add rate limiting API.
227
+ Usage of `params.require(:id)` should likewise be replaced with
228
+ `params.expect(:id)` which is designed to ensure that `params[:id]`
229
+ is a scalar and not an array or hash, also requiring the param.
169
230
 
170
231
  ```ruby
171
- class SessionsController < ApplicationController
172
- rate_limit to: 10, within: 3.minutes, only: :create
173
- end
232
+ # Before
233
+ User.find(params.require(:id)) # allows an array, altering behavior
174
234
 
175
- class SignupsController < ApplicationController
176
- rate_limit to: 1000, within: 10.seconds,
177
- by: -> { request.domain }, with: -> { redirect_to busy_controller_url, alert: "Too many signups!" }, only: :new
178
- end
235
+ # After
236
+ User.find(params.expect(:id)) # expect only returns non-blank permitted scalars (excludes Hash, Array, nil, "", etc)
179
237
  ```
180
238
 
181
- *DHH*, *Jean Boussier*
239
+ *Martin Emde*
182
240
 
183
- * Add `image/svg+xml` to the compressible content types of `ActionDispatch::Static`.
241
+ * System Testing: Disable Chrome's search engine choice by default in system tests.
184
242
 
185
- *Georg Ledermann*
243
+ *glaszig*
186
244
 
187
- * Add instrumentation for `ActionController::Live#send_stream`.
245
+ * Fix `Request#raw_post` raising `NoMethodError` when `rack.input` is `nil`.
188
246
 
189
- Allows subscribing to `send_stream` events. The event payload contains the filename, disposition, and type.
247
+ *Hartley McGuire*
248
+
249
+ * Remove `racc` dependency by manually writing `ActionDispatch::Journey::Scanner`.
190
250
 
191
- *Hannah Ramadan*
251
+ *Gannon McGibbon*
192
252
 
193
- * Add support for `with_routing` test helper in `ActionDispatch::IntegrationTest`.
253
+ * Speed up `ActionDispatch::Routing::Mapper::Scope#[]` by merging frame hashes.
194
254
 
195
255
  *Gannon McGibbon*
196
256
 
197
- * Remove deprecated support to set `Rails.application.config.action_dispatch.show_exceptions` to `true` and `false`.
257
+ * Allow bots to ignore `allow_browser`.
198
258
 
199
- *Rafael Mendonça França*
259
+ *Matthew Nguyen*
200
260
 
201
- * Remove deprecated `speaker`, `vibrate`, and `vr` permissions policy directives.
261
+ * Deprecate drawing routes with multiple paths to make routing faster.
262
+ You may use `with_options` or a loop to make drawing multiple paths easier.
202
263
 
203
- *Rafael Mendonça França*
264
+ ```ruby
265
+ # Before
266
+ get "/users", "/other_path", to: "users#index"
204
267
 
205
- * Remove deprecated `Rails.application.config.action_dispatch.return_only_request_media_type_on_content_type`.
268
+ # After
269
+ get "/users", to: "users#index"
270
+ get "/other_path", to: "users#index"
271
+ ```
206
272
 
207
- *Rafael Mendonça França*
273
+ *Gannon McGibbon*
208
274
 
209
- * Deprecate `Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality`.
275
+ * Make `http_cache_forever` use `immutable: true`
210
276
 
211
- *Rafael Mendonça França*
277
+ *Nate Matykiewicz*
212
278
 
213
- * Remove deprecated comparison between `ActionController::Parameters` and `Hash`.
279
+ * Add `config.action_dispatch.strict_freshness`.
214
280
 
215
- *Rafael Mendonça França*
281
+ When set to `true`, the `ETag` header takes precedence over the `Last-Modified` header when both are present,
282
+ as specified by RFC 7232, Section 6.
216
283
 
217
- * Remove deprecated constant `AbstractController::Helpers::MissingHelperError`.
284
+ Defaults to `false` to maintain compatibility with previous versions of Rails, but is enabled as part of
285
+ Rails 8.0 defaults.
218
286
 
219
- *Rafael Mendonça França*
287
+ *heka1024*
288
+
289
+ * Support `immutable` directive in Cache-Control
220
290
 
221
- * Fix a race condition that could cause a `Text file busy - chromedriver`
222
- error with parallel system tests.
291
+ ```ruby
292
+ expires_in 1.minute, public: true, immutable: true
293
+ # Cache-Control: public, max-age=60, immutable
294
+ ```
223
295
 
224
- *Matt Brictson*
296
+ *heka1024*
225
297
 
226
- * Add `racc` as a dependency since it will become a bundled gem in Ruby 3.4.0
298
+ * Add `:wasm_unsafe_eval` mapping for `content_security_policy`
227
299
 
228
- *Hartley McGuire*
229
- * Remove deprecated constant `ActionDispatch::IllegalStateError`.
300
+ ```ruby
301
+ # Before
302
+ policy.script_src "'wasm-unsafe-eval'"
230
303
 
231
- *Rafael Mendonça França*
304
+ # After
305
+ policy.script_src :wasm_unsafe_eval
306
+ ```
232
307
 
233
- * Add parameter filter capability for redirect locations.
308
+ *Joe Haig*
234
309
 
235
- It uses the `config.filter_parameters` to match what needs to be filtered.
236
- The result would be like this:
310
+ * Add `display_capture` and `keyboard_map` in `permissions_policy`
237
311
 
238
- Redirected to http://secret.foo.bar?username=roque&password=[FILTERED]
312
+ *Cyril Blaecke*
239
313
 
240
- Fixes #14055.
314
+ * Add `connect` route helper.
241
315
 
242
- *Roque Pinel*, *Trevor Turk*, *tonytonyjan*
316
+ *Samuel Williams*
243
317
 
244
- Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/actionpack/CHANGELOG.md) for previous changes.
318
+ Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/actionpack/CHANGELOG.md) for previous changes.
@@ -5,7 +5,6 @@
5
5
  require "abstract_controller/error"
6
6
  require "action_view"
7
7
  require "action_view/view_paths"
8
- require "set"
9
8
 
10
9
  module AbstractController
11
10
  class DoubleRenderError < Error
@@ -266,7 +266,7 @@ module ActionController
266
266
  ParamsWrapper
267
267
  ]
268
268
 
269
- # Note: Documenting these severely degrates the performance of rdoc
269
+ # Note: Documenting these severely degrades the performance of rdoc
270
270
  # :stopdoc:
271
271
  include AbstractController::Rendering
272
272
  include AbstractController::Translation
@@ -22,10 +22,10 @@ module ActionController
22
22
  # default_form_builder AdminFormBuilder
23
23
  # end
24
24
  #
25
- # Then in the view any form using `form_for` will be an instance of the
26
- # specified form builder:
25
+ # Then in the view any form using `form_with` or `form_for` will be an
26
+ # instance of the specified form builder:
27
27
  #
28
- # <%= form_for(@instance) do |builder| %>
28
+ # <%= form_with(model: @instance) do |builder| %>
29
29
  # <%= builder.special_field(:name) %>
30
30
  # <% end %>
31
31
  module FormBuilder
@@ -36,6 +36,16 @@ module ActionController # :nodoc:
36
36
  # end
37
37
  #
38
38
  # class ApplicationController < ActionController::Base
39
+ # # Allow only browsers natively supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has
40
+ # allow_browser versions: :modern, block: :handle_outdated_browser
41
+ #
42
+ # private
43
+ # def handle_outdated_browser
44
+ # render file: Rails.root.join("public/custom-error.html"), status: :not_acceptable
45
+ # end
46
+ # end
47
+ #
48
+ # class ApplicationController < ActionController::Base
39
49
  # # All versions of Chrome and Opera will be allowed, but no versions of "internet explorer" (ie). Safari needs to be 16.4+ and Firefox 121+.
40
50
  # allow_browser versions: { safari: 16.4, firefox: 121, ie: false }
41
51
  # end
@@ -55,7 +65,7 @@ module ActionController # :nodoc:
55
65
 
56
66
  if BrowserBlocker.new(request, versions: versions).blocked?
57
67
  ActiveSupport::Notifications.instrument("browser_block.action_controller", request: request, versions: versions) do
58
- instance_exec(&block)
68
+ block.is_a?(Symbol) ? send(block) : instance_exec(&block)
59
69
  end
60
70
  end
61
71
  end
@@ -259,6 +259,9 @@ module ActionController
259
259
  # `:stale_if_error`
260
260
  # : Sets the value of the `stale-if-error` directive.
261
261
  #
262
+ # `:immutable`
263
+ # : If true, adds the `immutable` directive.
264
+ #
262
265
  #
263
266
  # Any additional key-value pairs are concatenated as directives. For a list of
264
267
  # supported `Cache-Control` directives, see the [article on
@@ -292,6 +295,7 @@ module ActionController
292
295
  must_revalidate: options.delete(:must_revalidate),
293
296
  stale_while_revalidate: options.delete(:stale_while_revalidate),
294
297
  stale_if_error: options.delete(:stale_if_error),
298
+ immutable: options.delete(:immutable),
295
299
  )
296
300
  options.delete(:private)
297
301
 
@@ -315,7 +319,7 @@ module ActionController
315
319
  # user's web browser. To allow proxies to cache the response, set `true` to
316
320
  # indicate that they can serve the cached response to all users.
317
321
  def http_cache_forever(public: false)
318
- expires_in 100.years, public: public
322
+ expires_in 100.years, public: public, immutable: true
319
323
 
320
324
  yield if stale?(etag: request.fullpath,
321
325
  last_modified: Time.new(2011, 1, 1).utc,
@@ -28,7 +28,8 @@ module ActionController # :nodoc:
28
28
  # `send_file(params[:path])` allows a malicious user to download any file on
29
29
  # your server.
30
30
  #
31
- # Options:
31
+ # #### Options:
32
+ #
32
33
  # * `:filename` - suggests a filename for the browser to use. Defaults to
33
34
  # `File.basename(path)`.
34
35
  # * `:type` - specifies an HTTP content type. You can specify either a string
@@ -90,7 +91,8 @@ module ActionController # :nodoc:
90
91
  # inline data. You may also set the content type, the file name, and other
91
92
  # things.
92
93
  #
93
- # Options:
94
+ # #### Options:
95
+ #
94
96
  # * `:filename` - suggests a filename for the browser to use.
95
97
  # * `:type` - specifies an HTTP content type. Defaults to
96
98
  # `application/octet-stream`. You can specify either a string or a symbol
@@ -2,7 +2,6 @@
2
2
 
3
3
  # :markup: markdown
4
4
 
5
- require "benchmark"
6
5
  require "abstract_controller/logger"
7
6
 
8
7
  module ActionController
@@ -29,7 +28,7 @@ module ActionController
29
28
  def render(*)
30
29
  render_output = nil
31
30
  self.view_runtime = cleanup_view_runtime do
32
- Benchmark.ms { render_output = super }
31
+ ActiveSupport::Benchmark.realtime(:float_millisecond) { render_output = super }
33
32
  end
34
33
  render_output
35
34
  end