actionpack 7.2.3 → 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 +198 -119
  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 +3 -3
  48. metadata +15 -48
  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: e774a50c3ffb6c9c4f387e2bf3632992f1979e8b050cdd481e0ff41fc289f4d4
4
- data.tar.gz: b433f1b952b2cca2850d40a668bbf4196a72dd1981ede7714348607cb79fadb1
3
+ metadata.gz: 2effaa8c37f91de6cda898c8ebb9857da735e8c2064c46473f4bd52caa70466c
4
+ data.tar.gz: c42b8c6737bce6b429ea71f66a86fcdc7cd468887c110829b527296d253adbd5
5
5
  SHA512:
6
- metadata.gz: 7c48de1742782bbad870035834911eb2bac273330d2d34317c2d670f02d762d9998f024491fe37e17b8628f4255844d66fec7522bb47e10668e0a775e160e6c4
7
- data.tar.gz: d72cf3db810cc51bfca8ff37af293e22a4089838ec00fb8cc44dce15d77255937a7221a90b6fdd2dc38f01803abd42757641b5fb665d6c121111bf3e548022f4
6
+ metadata.gz: 8b23a24307dd4d5ffb5d2ac31618809026d8b9620b27382a7b23d321648796b45f6e90d199117b4cc69b39db4d6558ad3dbef075ce5e5543043c57ae5f5cda25
7
+ data.tar.gz: ace10e1524236d4cb72929262e3222c35a09a7abad52bc86b49abf979331261bdbd8860723afe96bc7e98e5a819b5cd62a1fd42f6ce7e31039b399facb61c409
data/CHANGELOG.md CHANGED
@@ -1,9 +1,54 @@
1
- ## Rails 7.2.3 (October 28, 2025) ##
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) ##
23
+
24
+ * No changes.
25
+
26
+
27
+ ## Rails 8.0.4 (October 28, 2025) ##
2
28
 
3
29
  * Submit test requests using `as: :html` with `Content-Type: x-www-form-urlencoded`
4
30
 
5
31
  *Sean Doyle*
6
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
+
7
52
  * Address `rack 3.2` deprecations warnings.
8
53
 
9
54
  ```
@@ -11,10 +56,14 @@
11
56
  Please use :unprocessable_content instead.
12
57
  ```
13
58
 
14
- 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.
15
60
 
16
61
  *Earlopain*, *Jean Boussier*
17
62
 
63
+ * Support hash-source in Content Security Policy.
64
+
65
+ *madogiwa*
66
+
18
67
  * Always return empty body for HEAD requests in `PublicExceptions` and
19
68
  `DebugExceptions`.
20
69
 
@@ -22,218 +71,248 @@
22
71
 
23
72
  *Hartley McGuire*
24
73
 
25
- * Fix `url_for` to handle `:path_params` gracefully when it's not a `Hash`.
26
-
27
- Prevents various security scanners from causing exceptions.
28
74
 
29
- *Martin Emde*
75
+ ## Rails 8.0.2.1 (August 13, 2025) ##
30
76
 
31
- * Fix `ActionDispatch::Executor` to unwrap exceptions like other error reporting middlewares.
77
+ * No changes.
32
78
 
33
- *Jean Boussier*
79
+ ## Rails 8.0.2 (March 12, 2025) ##
34
80
 
35
- * Fix NoMethodError when a non-string CSRF token is passed through headers.
81
+ * Improve `with_routing` test helper to not rebuild the middleware stack.
36
82
 
37
- *Ryan Heneise*
83
+ Otherwise some middleware configuration could be lost.
38
84
 
39
- * Fix invalid response when rescuing `ActionController::Redirecting::UnsafeRedirectError` in a controller.
85
+ *Édouard Chin*
40
86
 
41
- *Alex Ghiculescu*
87
+ * Add resource name to the `ArgumentError` that's raised when invalid `:only` or `:except` options are given to `#resource` or `#resources`
42
88
 
89
+ This makes it easier to locate the source of the problem, especially for routes drawn by gems.
43
90
 
44
- ## 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
+ ```
45
95
 
46
- * 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
+ ```
47
100
 
101
+ *Jeremy Green*
48
102
 
49
- ## Rails 7.2.2.1 (December 10, 2024) ##
103
+ * Fix `url_for` to handle `:path_params` gracefully when it's not a `Hash`.
50
104
 
51
- * Add validation to content security policies to disallow spaces and semicolons.
52
- Developers should use multiple arguments, and different directive methods instead.
105
+ Prevents various security scanners from causing exceptions.
53
106
 
54
- [CVE-2024-54133]
107
+ *Martin Emde*
55
108
 
56
- *Gannon McGibbon*
109
+ * Fix `ActionDispatch::Executor` to unwrap exceptions like other error reporting middlewares.
57
110
 
111
+ *Jean Boussier*
58
112
 
59
- ## Rails 7.2.2 (October 30, 2024) ##
60
113
 
61
- * Fix non-GET requests not updating cookies in `ActionController::TestCase`.
114
+ ## Rails 8.0.1 (December 13, 2024) ##
62
115
 
63
- *Jon Moss*, *Hartley McGuire*
116
+ * Add `ActionDispatch::Request::Session#store` method to conform Rack spec.
64
117
 
118
+ *Yaroslav*
65
119
 
66
- ## Rails 7.2.1.2 (October 23, 2024) ##
67
120
 
68
- * No changes.
121
+ ## Rails 8.0.0.1 (December 10, 2024) ##
69
122
 
123
+ * Add validation to content security policies to disallow spaces and semicolons.
124
+ Developers should use multiple arguments, and different directive methods instead.
70
125
 
71
- ## Rails 7.2.1.1 (October 15, 2024) ##
126
+ [CVE-2024-54133]
72
127
 
73
- * Avoid regex backtracking in HTTP Token authentication
128
+ *Gannon McGibbon*
74
129
 
75
- [CVE-2024-47887]
76
130
 
77
- *John Hawthorn*
131
+ ## Rails 8.0.0 (November 07, 2024) ##
78
132
 
79
- * Avoid regex backtracking in query parameter filtering
133
+ * No changes.
80
134
 
81
- [CVE-2024-41128]
82
135
 
83
- *John Hawthorn*
136
+ ## Rails 8.0.0.rc2 (October 30, 2024) ##
84
137
 
138
+ * Fix routes with `::` in the path.
85
139
 
86
- ## Rails 7.2.1 (August 22, 2024) ##
140
+ *Rafael Mendonça França*
87
141
 
88
- * Fix `Request#raw_post` raising `NoMethodError` when `rack.input` is `nil`.
142
+ * Maintain Rack 2 parameter parsing behaviour.
89
143
 
90
- *Hartley McGuire*
144
+ *Matthew Draper*
91
145
 
92
146
 
93
- ## Rails 7.2.0 (August 09, 2024) ##
147
+ ## Rails 8.0.0.rc1 (October 19, 2024) ##
94
148
 
95
- * Allow bots to ignore `allow_browser`.
149
+ * Remove `Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality`.
96
150
 
97
- *Matthew Nguyen*
151
+ *Rafael Mendonça França*
98
152
 
99
- * Include the HTTP Permissions-Policy on non-HTML Content-Types
100
- [CVE-2024-28103]
153
+ * Improve `ActionController::TestCase` to expose a binary encoded `request.body`.
101
154
 
102
- *Aaron Patterson*, *Zack Deveau*
155
+ The rack spec clearly states:
103
156
 
104
- * 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.
105
159
 
106
- *Taylor Chaparro*
160
+ Until now its encoding was generally UTF-8, which doesn't accurately reflect production
161
+ behavior.
107
162
 
108
- * Fix the error page that is displayed when a view template is missing to account for nested controller paths in the
109
- suggested correct location for the missing template.
163
+ *Jean Boussier*
110
164
 
111
- *Joshua Young*
165
+ * Update `ActionController::AllowBrowser` to support passing method names to `:block`
112
166
 
113
- * Add `save_and_open_page` helper to `IntegrationTest`.
167
+ ```ruby
168
+ class ApplicationController < ActionController::Base
169
+ allow_browser versions: :modern, block: :handle_outdated_browser
114
170
 
115
- `save_and_open_page` is a helpful helper to keep a short feedback loop when working on system tests.
116
- 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
+ ```
117
177
 
118
- *Joé Dupuis*
178
+ *Sean Doyle*
119
179
 
120
- * 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`.
121
181
 
122
- ```ruby
123
- Rails.application.routes.draw do
124
- controller :home do
125
- get "recent", to: "recent_posts"
126
- end
127
- end
128
- ```
182
+ *Joshua Young*
129
183
 
130
- *Étienne Barrié*
184
+ ## Rails 8.0.0.beta1 (September 26, 2024) ##
131
185
 
132
- * Request Forgery takes relative paths into account.
186
+ * Fix non-GET requests not updating cookies in `ActionController::TestCase`.
133
187
 
134
- *Stefan Wienert*
188
+ *Jon Moss*, *Hartley McGuire*
135
189
 
136
- * 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.
137
191
 
138
- *DHH*
192
+ *Adam Renberg Tamm*
139
193
 
140
- * 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)`
141
196
 
142
- 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.
143
200
 
144
201
  ```ruby
145
- class ApplicationController < ActionController::Base
146
- # Allow only browsers natively supporting webp images, web push, badges, import maps, CSS nesting + :has
147
- allow_browser versions: :modern
148
- 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
+ ```
149
211
 
150
- class ApplicationController < ActionController::Base
151
- # 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+.
152
- allow_browser versions: { safari: 16.4, firefox: 121, ie: false }
153
- 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.
154
217
 
155
- class MessagesController < ApplicationController
156
- # In addition to the browsers blocked by ApplicationController, also block Opera below 104 and Chrome below 119 for the show action.
157
- allow_browser versions: { opera: 104, chrome: 119 }, only: :show
158
- end
159
- ```
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.
160
221
 
161
- *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
162
226
 
163
- * 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.
164
230
 
165
231
  ```ruby
166
- class SessionsController < ApplicationController
167
- rate_limit to: 10, within: 3.minutes, only: :create
168
- end
232
+ # Before
233
+ User.find(params.require(:id)) # allows an array, altering behavior
169
234
 
170
- class SignupsController < ApplicationController
171
- rate_limit to: 1000, within: 10.seconds,
172
- by: -> { request.domain }, with: -> { redirect_to busy_controller_url, alert: "Too many signups!" }, only: :new
173
- end
235
+ # After
236
+ User.find(params.expect(:id)) # expect only returns non-blank permitted scalars (excludes Hash, Array, nil, "", etc)
174
237
  ```
175
238
 
176
- *DHH*, *Jean Boussier*
239
+ *Martin Emde*
177
240
 
178
- * 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.
179
242
 
180
- *Georg Ledermann*
243
+ *glaszig*
181
244
 
182
- * Add instrumentation for `ActionController::Live#send_stream`.
245
+ * Fix `Request#raw_post` raising `NoMethodError` when `rack.input` is `nil`.
183
246
 
184
- Allows subscribing to `send_stream` events. The event payload contains the filename, disposition, and type.
247
+ *Hartley McGuire*
185
248
 
186
- *Hannah Ramadan*
249
+ * Remove `racc` dependency by manually writing `ActionDispatch::Journey::Scanner`.
187
250
 
188
- * Add support for `with_routing` test helper in `ActionDispatch::IntegrationTest`.
251
+ *Gannon McGibbon*
252
+
253
+ * Speed up `ActionDispatch::Routing::Mapper::Scope#[]` by merging frame hashes.
189
254
 
190
255
  *Gannon McGibbon*
191
256
 
192
- * Remove deprecated support to set `Rails.application.config.action_dispatch.show_exceptions` to `true` and `false`.
257
+ * Allow bots to ignore `allow_browser`.
193
258
 
194
- *Rafael Mendonça França*
259
+ *Matthew Nguyen*
195
260
 
196
- * 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.
197
263
 
198
- *Rafael Mendonça França*
264
+ ```ruby
265
+ # Before
266
+ get "/users", "/other_path", to: "users#index"
199
267
 
200
- * 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
+ ```
201
272
 
202
- *Rafael Mendonça França*
273
+ *Gannon McGibbon*
203
274
 
204
- * Deprecate `Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality`.
275
+ * Make `http_cache_forever` use `immutable: true`
205
276
 
206
- *Rafael Mendonça França*
277
+ *Nate Matykiewicz*
207
278
 
208
- * Remove deprecated comparison between `ActionController::Parameters` and `Hash`.
279
+ * Add `config.action_dispatch.strict_freshness`.
209
280
 
210
- *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.
211
283
 
212
- * 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.
213
286
 
214
- *Rafael Mendonça França*
287
+ *heka1024*
215
288
 
216
- * Fix a race condition that could cause a `Text file busy - chromedriver`
217
- error with parallel system tests.
289
+ * Support `immutable` directive in Cache-Control
218
290
 
219
- *Matt Brictson*
291
+ ```ruby
292
+ expires_in 1.minute, public: true, immutable: true
293
+ # Cache-Control: public, max-age=60, immutable
294
+ ```
220
295
 
221
- * Add `racc` as a dependency since it will become a bundled gem in Ruby 3.4.0
296
+ *heka1024*
222
297
 
223
- *Hartley McGuire*
224
- * Remove deprecated constant `ActionDispatch::IllegalStateError`.
298
+ * Add `:wasm_unsafe_eval` mapping for `content_security_policy`
225
299
 
226
- *Rafael Mendonça França*
300
+ ```ruby
301
+ # Before
302
+ policy.script_src "'wasm-unsafe-eval'"
303
+
304
+ # After
305
+ policy.script_src :wasm_unsafe_eval
306
+ ```
227
307
 
228
- * Add parameter filter capability for redirect locations.
308
+ *Joe Haig*
229
309
 
230
- It uses the `config.filter_parameters` to match what needs to be filtered.
231
- The result would be like this:
310
+ * Add `display_capture` and `keyboard_map` in `permissions_policy`
232
311
 
233
- Redirected to http://secret.foo.bar?username=roque&password=[FILTERED]
312
+ *Cyril Blaecke*
234
313
 
235
- Fixes #14055.
314
+ * Add `connect` route helper.
236
315
 
237
- *Roque Pinel*, *Trevor Turk*, *tonytonyjan*
316
+ *Samuel Williams*
238
317
 
239
- 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