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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +194 -120
- data/lib/abstract_controller/rendering.rb +0 -1
- data/lib/action_controller/base.rb +1 -1
- data/lib/action_controller/form_builder.rb +3 -3
- data/lib/action_controller/metal/allow_browser.rb +11 -1
- data/lib/action_controller/metal/conditional_get.rb +5 -1
- data/lib/action_controller/metal/data_streaming.rb +4 -2
- data/lib/action_controller/metal/instrumentation.rb +1 -2
- data/lib/action_controller/metal/live.rb +58 -10
- data/lib/action_controller/metal/rate_limiting.rb +13 -4
- data/lib/action_controller/metal/renderers.rb +2 -3
- data/lib/action_controller/metal/streaming.rb +5 -84
- data/lib/action_controller/metal/strong_parameters.rb +277 -89
- data/lib/action_controller/railtie.rb +6 -7
- data/lib/action_controller/test_case.rb +12 -2
- data/lib/action_dispatch/http/cache.rb +27 -10
- data/lib/action_dispatch/http/content_security_policy.rb +14 -1
- data/lib/action_dispatch/http/param_builder.rb +186 -0
- data/lib/action_dispatch/http/param_error.rb +26 -0
- data/lib/action_dispatch/http/permissions_policy.rb +2 -0
- data/lib/action_dispatch/http/query_parser.rb +53 -0
- data/lib/action_dispatch/http/request.rb +60 -16
- data/lib/action_dispatch/http/response.rb +34 -13
- data/lib/action_dispatch/journey/parser.rb +99 -196
- data/lib/action_dispatch/journey/scanner.rb +44 -42
- data/lib/action_dispatch/middleware/cookies.rb +4 -2
- data/lib/action_dispatch/middleware/debug_exceptions.rb +17 -4
- data/lib/action_dispatch/middleware/debug_view.rb +0 -5
- data/lib/action_dispatch/middleware/exception_wrapper.rb +0 -6
- data/lib/action_dispatch/middleware/request_id.rb +2 -1
- data/lib/action_dispatch/middleware/ssl.rb +13 -3
- data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +0 -3
- data/lib/action_dispatch/railtie.rb +8 -0
- data/lib/action_dispatch/request/session.rb +1 -0
- data/lib/action_dispatch/request/utils.rb +9 -3
- data/lib/action_dispatch/routing/inspector.rb +1 -1
- data/lib/action_dispatch/routing/mapper.rb +91 -62
- data/lib/action_dispatch/routing/polymorphic_routes.rb +2 -2
- data/lib/action_dispatch/routing/route_set.rb +21 -10
- data/lib/action_dispatch/routing/routes_proxy.rb +1 -0
- data/lib/action_dispatch/system_testing/browser.rb +12 -21
- data/lib/action_dispatch/testing/assertions/response.rb +12 -2
- data/lib/action_dispatch/testing/assertions/routing.rb +16 -12
- data/lib/action_dispatch/testing/integration.rb +18 -7
- data/lib/action_dispatch.rb +6 -4
- data/lib/action_pack/gem_version.rb +4 -4
- metadata +14 -47
- data/lib/action_dispatch/journey/parser.y +0 -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:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2effaa8c37f91de6cda898c8ebb9857da735e8c2064c46473f4bd52caa70466c
|
|
4
|
+
data.tar.gz: c42b8c6737bce6b429ea71f66a86fcdc7cd468887c110829b527296d253adbd5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8b23a24307dd4d5ffb5d2ac31618809026d8b9620b27382a7b23d321648796b45f6e90d199117b4cc69b39db4d6558ad3dbef075ce5e5543043c57ae5f5cda25
|
|
7
|
+
data.tar.gz: ace10e1524236d4cb72929262e3222c35a09a7abad52bc86b49abf979331261bdbd8860723afe96bc7e98e5a819b5cd62a1fd42f6ce7e31039b399facb61c409
|
data/CHANGELOG.md
CHANGED
|
@@ -1,14 +1,54 @@
|
|
|
1
|
-
## Rails
|
|
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
|
|
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
|
|
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
|
-
|
|
75
|
+
## Rails 8.0.2.1 (August 13, 2025) ##
|
|
35
76
|
|
|
36
|
-
*
|
|
77
|
+
* No changes.
|
|
37
78
|
|
|
38
|
-
|
|
79
|
+
## Rails 8.0.2 (March 12, 2025) ##
|
|
39
80
|
|
|
40
|
-
*
|
|
81
|
+
* Improve `with_routing` test helper to not rebuild the middleware stack.
|
|
41
82
|
|
|
42
|
-
|
|
83
|
+
Otherwise some middleware configuration could be lost.
|
|
43
84
|
|
|
44
|
-
*
|
|
85
|
+
*Édouard Chin*
|
|
45
86
|
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
103
|
+
* Fix `url_for` to handle `:path_params` gracefully when it's not a `Hash`.
|
|
55
104
|
|
|
56
|
-
|
|
57
|
-
Developers should use multiple arguments, and different directive methods instead.
|
|
105
|
+
Prevents various security scanners from causing exceptions.
|
|
58
106
|
|
|
59
|
-
|
|
107
|
+
*Martin Emde*
|
|
60
108
|
|
|
61
|
-
|
|
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
|
-
|
|
114
|
+
## Rails 8.0.1 (December 13, 2024) ##
|
|
67
115
|
|
|
68
|
-
|
|
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
|
-
|
|
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
|
-
|
|
126
|
+
[CVE-2024-54133]
|
|
77
127
|
|
|
78
|
-
*
|
|
128
|
+
*Gannon McGibbon*
|
|
79
129
|
|
|
80
|
-
[CVE-2024-47887]
|
|
81
130
|
|
|
82
|
-
|
|
131
|
+
## Rails 8.0.0 (November 07, 2024) ##
|
|
83
132
|
|
|
84
|
-
*
|
|
133
|
+
* No changes.
|
|
85
134
|
|
|
86
|
-
[CVE-2024-41128]
|
|
87
135
|
|
|
88
|
-
|
|
136
|
+
## Rails 8.0.0.rc2 (October 30, 2024) ##
|
|
89
137
|
|
|
138
|
+
* Fix routes with `::` in the path.
|
|
90
139
|
|
|
91
|
-
|
|
140
|
+
*Rafael Mendonça França*
|
|
92
141
|
|
|
93
|
-
*
|
|
142
|
+
* Maintain Rack 2 parameter parsing behaviour.
|
|
94
143
|
|
|
95
|
-
*
|
|
144
|
+
*Matthew Draper*
|
|
96
145
|
|
|
97
146
|
|
|
98
|
-
## Rails
|
|
147
|
+
## Rails 8.0.0.rc1 (October 19, 2024) ##
|
|
99
148
|
|
|
100
|
-
*
|
|
149
|
+
* Remove `Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality`.
|
|
101
150
|
|
|
102
|
-
*
|
|
151
|
+
*Rafael Mendonça França*
|
|
103
152
|
|
|
104
|
-
*
|
|
105
|
-
[CVE-2024-28103]
|
|
153
|
+
* Improve `ActionController::TestCase` to expose a binary encoded `request.body`.
|
|
106
154
|
|
|
107
|
-
|
|
155
|
+
The rack spec clearly states:
|
|
108
156
|
|
|
109
|
-
|
|
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
|
-
|
|
160
|
+
Until now its encoding was generally UTF-8, which doesn't accurately reflect production
|
|
161
|
+
behavior.
|
|
112
162
|
|
|
113
|
-
*
|
|
114
|
-
suggested correct location for the missing template.
|
|
163
|
+
*Jean Boussier*
|
|
115
164
|
|
|
116
|
-
|
|
165
|
+
* Update `ActionController::AllowBrowser` to support passing method names to `:block`
|
|
117
166
|
|
|
118
|
-
|
|
167
|
+
```ruby
|
|
168
|
+
class ApplicationController < ActionController::Base
|
|
169
|
+
allow_browser versions: :modern, block: :handle_outdated_browser
|
|
119
170
|
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
*
|
|
178
|
+
*Sean Doyle*
|
|
124
179
|
|
|
125
|
-
*
|
|
180
|
+
* Raise an `ArgumentError` when invalid `:only` or `:except` options are passed into `#resource` and `#resources`.
|
|
126
181
|
|
|
127
|
-
|
|
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
|
-
|
|
184
|
+
## Rails 8.0.0.beta1 (September 26, 2024) ##
|
|
136
185
|
|
|
137
|
-
*
|
|
186
|
+
* Fix non-GET requests not updating cookies in `ActionController::TestCase`.
|
|
138
187
|
|
|
139
|
-
*
|
|
188
|
+
*Jon Moss*, *Hartley McGuire*
|
|
140
189
|
|
|
141
|
-
*
|
|
190
|
+
* Update `ActionController::Live` to use a thread-pool to reuse threads across requests.
|
|
142
191
|
|
|
143
|
-
*
|
|
192
|
+
*Adam Renberg Tamm*
|
|
144
193
|
|
|
145
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
end
|
|
232
|
+
# Before
|
|
233
|
+
User.find(params.require(:id)) # allows an array, altering behavior
|
|
174
234
|
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
*
|
|
239
|
+
*Martin Emde*
|
|
182
240
|
|
|
183
|
-
*
|
|
241
|
+
* System Testing: Disable Chrome's search engine choice by default in system tests.
|
|
184
242
|
|
|
185
|
-
*
|
|
243
|
+
*glaszig*
|
|
186
244
|
|
|
187
|
-
*
|
|
245
|
+
* Fix `Request#raw_post` raising `NoMethodError` when `rack.input` is `nil`.
|
|
188
246
|
|
|
189
|
-
|
|
247
|
+
*Hartley McGuire*
|
|
248
|
+
|
|
249
|
+
* Remove `racc` dependency by manually writing `ActionDispatch::Journey::Scanner`.
|
|
190
250
|
|
|
191
|
-
*
|
|
251
|
+
*Gannon McGibbon*
|
|
192
252
|
|
|
193
|
-
*
|
|
253
|
+
* Speed up `ActionDispatch::Routing::Mapper::Scope#[]` by merging frame hashes.
|
|
194
254
|
|
|
195
255
|
*Gannon McGibbon*
|
|
196
256
|
|
|
197
|
-
*
|
|
257
|
+
* Allow bots to ignore `allow_browser`.
|
|
198
258
|
|
|
199
|
-
*
|
|
259
|
+
*Matthew Nguyen*
|
|
200
260
|
|
|
201
|
-
*
|
|
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
|
-
|
|
264
|
+
```ruby
|
|
265
|
+
# Before
|
|
266
|
+
get "/users", "/other_path", to: "users#index"
|
|
204
267
|
|
|
205
|
-
|
|
268
|
+
# After
|
|
269
|
+
get "/users", to: "users#index"
|
|
270
|
+
get "/other_path", to: "users#index"
|
|
271
|
+
```
|
|
206
272
|
|
|
207
|
-
*
|
|
273
|
+
*Gannon McGibbon*
|
|
208
274
|
|
|
209
|
-
*
|
|
275
|
+
* Make `http_cache_forever` use `immutable: true`
|
|
210
276
|
|
|
211
|
-
*
|
|
277
|
+
*Nate Matykiewicz*
|
|
212
278
|
|
|
213
|
-
*
|
|
279
|
+
* Add `config.action_dispatch.strict_freshness`.
|
|
214
280
|
|
|
215
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
287
|
+
*heka1024*
|
|
288
|
+
|
|
289
|
+
* Support `immutable` directive in Cache-Control
|
|
220
290
|
|
|
221
|
-
|
|
222
|
-
|
|
291
|
+
```ruby
|
|
292
|
+
expires_in 1.minute, public: true, immutable: true
|
|
293
|
+
# Cache-Control: public, max-age=60, immutable
|
|
294
|
+
```
|
|
223
295
|
|
|
224
|
-
*
|
|
296
|
+
*heka1024*
|
|
225
297
|
|
|
226
|
-
* Add `
|
|
298
|
+
* Add `:wasm_unsafe_eval` mapping for `content_security_policy`
|
|
227
299
|
|
|
228
|
-
|
|
229
|
-
|
|
300
|
+
```ruby
|
|
301
|
+
# Before
|
|
302
|
+
policy.script_src "'wasm-unsafe-eval'"
|
|
230
303
|
|
|
231
|
-
|
|
304
|
+
# After
|
|
305
|
+
policy.script_src :wasm_unsafe_eval
|
|
306
|
+
```
|
|
232
307
|
|
|
233
|
-
*
|
|
308
|
+
*Joe Haig*
|
|
234
309
|
|
|
235
|
-
|
|
236
|
-
The result would be like this:
|
|
310
|
+
* Add `display_capture` and `keyboard_map` in `permissions_policy`
|
|
237
311
|
|
|
238
|
-
|
|
312
|
+
*Cyril Blaecke*
|
|
239
313
|
|
|
240
|
-
|
|
314
|
+
* Add `connect` route helper.
|
|
241
315
|
|
|
242
|
-
*
|
|
316
|
+
*Samuel Williams*
|
|
243
317
|
|
|
244
|
-
Please check [7-
|
|
318
|
+
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/actionpack/CHANGELOG.md) for previous changes.
|
|
@@ -266,7 +266,7 @@ module ActionController
|
|
|
266
266
|
ParamsWrapper
|
|
267
267
|
]
|
|
268
268
|
|
|
269
|
-
# Note: Documenting these severely
|
|
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
|
|
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
|
-
# <%=
|
|
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.
|
|
31
|
+
ActiveSupport::Benchmark.realtime(:float_millisecond) { render_output = super }
|
|
33
32
|
end
|
|
34
33
|
render_output
|
|
35
34
|
end
|