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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +198 -119
- 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 +3 -3
- metadata +15 -48
- 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,9 +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) ##
|
|
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
|
|
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
|
-
|
|
75
|
+
## Rails 8.0.2.1 (August 13, 2025) ##
|
|
30
76
|
|
|
31
|
-
*
|
|
77
|
+
* No changes.
|
|
32
78
|
|
|
33
|
-
|
|
79
|
+
## Rails 8.0.2 (March 12, 2025) ##
|
|
34
80
|
|
|
35
|
-
*
|
|
81
|
+
* Improve `with_routing` test helper to not rebuild the middleware stack.
|
|
36
82
|
|
|
37
|
-
|
|
83
|
+
Otherwise some middleware configuration could be lost.
|
|
38
84
|
|
|
39
|
-
*
|
|
85
|
+
*Édouard Chin*
|
|
40
86
|
|
|
41
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
103
|
+
* Fix `url_for` to handle `:path_params` gracefully when it's not a `Hash`.
|
|
50
104
|
|
|
51
|
-
|
|
52
|
-
Developers should use multiple arguments, and different directive methods instead.
|
|
105
|
+
Prevents various security scanners from causing exceptions.
|
|
53
106
|
|
|
54
|
-
|
|
107
|
+
*Martin Emde*
|
|
55
108
|
|
|
56
|
-
|
|
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
|
-
|
|
114
|
+
## Rails 8.0.1 (December 13, 2024) ##
|
|
62
115
|
|
|
63
|
-
|
|
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
|
-
|
|
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
|
-
|
|
126
|
+
[CVE-2024-54133]
|
|
72
127
|
|
|
73
|
-
*
|
|
128
|
+
*Gannon McGibbon*
|
|
74
129
|
|
|
75
|
-
[CVE-2024-47887]
|
|
76
130
|
|
|
77
|
-
|
|
131
|
+
## Rails 8.0.0 (November 07, 2024) ##
|
|
78
132
|
|
|
79
|
-
*
|
|
133
|
+
* No changes.
|
|
80
134
|
|
|
81
|
-
[CVE-2024-41128]
|
|
82
135
|
|
|
83
|
-
|
|
136
|
+
## Rails 8.0.0.rc2 (October 30, 2024) ##
|
|
84
137
|
|
|
138
|
+
* Fix routes with `::` in the path.
|
|
85
139
|
|
|
86
|
-
|
|
140
|
+
*Rafael Mendonça França*
|
|
87
141
|
|
|
88
|
-
*
|
|
142
|
+
* Maintain Rack 2 parameter parsing behaviour.
|
|
89
143
|
|
|
90
|
-
*
|
|
144
|
+
*Matthew Draper*
|
|
91
145
|
|
|
92
146
|
|
|
93
|
-
## Rails
|
|
147
|
+
## Rails 8.0.0.rc1 (October 19, 2024) ##
|
|
94
148
|
|
|
95
|
-
*
|
|
149
|
+
* Remove `Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality`.
|
|
96
150
|
|
|
97
|
-
*
|
|
151
|
+
*Rafael Mendonça França*
|
|
98
152
|
|
|
99
|
-
*
|
|
100
|
-
[CVE-2024-28103]
|
|
153
|
+
* Improve `ActionController::TestCase` to expose a binary encoded `request.body`.
|
|
101
154
|
|
|
102
|
-
|
|
155
|
+
The rack spec clearly states:
|
|
103
156
|
|
|
104
|
-
|
|
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
|
-
|
|
160
|
+
Until now its encoding was generally UTF-8, which doesn't accurately reflect production
|
|
161
|
+
behavior.
|
|
107
162
|
|
|
108
|
-
*
|
|
109
|
-
suggested correct location for the missing template.
|
|
163
|
+
*Jean Boussier*
|
|
110
164
|
|
|
111
|
-
|
|
165
|
+
* Update `ActionController::AllowBrowser` to support passing method names to `:block`
|
|
112
166
|
|
|
113
|
-
|
|
167
|
+
```ruby
|
|
168
|
+
class ApplicationController < ActionController::Base
|
|
169
|
+
allow_browser versions: :modern, block: :handle_outdated_browser
|
|
114
170
|
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
*
|
|
178
|
+
*Sean Doyle*
|
|
119
179
|
|
|
120
|
-
*
|
|
180
|
+
* Raise an `ArgumentError` when invalid `:only` or `:except` options are passed into `#resource` and `#resources`.
|
|
121
181
|
|
|
122
|
-
|
|
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
|
-
|
|
184
|
+
## Rails 8.0.0.beta1 (September 26, 2024) ##
|
|
131
185
|
|
|
132
|
-
*
|
|
186
|
+
* Fix non-GET requests not updating cookies in `ActionController::TestCase`.
|
|
133
187
|
|
|
134
|
-
*
|
|
188
|
+
*Jon Moss*, *Hartley McGuire*
|
|
135
189
|
|
|
136
|
-
*
|
|
190
|
+
* Update `ActionController::Live` to use a thread-pool to reuse threads across requests.
|
|
137
191
|
|
|
138
|
-
*
|
|
192
|
+
*Adam Renberg Tamm*
|
|
139
193
|
|
|
140
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
167
|
-
|
|
168
|
-
end
|
|
232
|
+
# Before
|
|
233
|
+
User.find(params.require(:id)) # allows an array, altering behavior
|
|
169
234
|
|
|
170
|
-
|
|
171
|
-
|
|
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
|
-
*
|
|
239
|
+
*Martin Emde*
|
|
177
240
|
|
|
178
|
-
*
|
|
241
|
+
* System Testing: Disable Chrome's search engine choice by default in system tests.
|
|
179
242
|
|
|
180
|
-
*
|
|
243
|
+
*glaszig*
|
|
181
244
|
|
|
182
|
-
*
|
|
245
|
+
* Fix `Request#raw_post` raising `NoMethodError` when `rack.input` is `nil`.
|
|
183
246
|
|
|
184
|
-
|
|
247
|
+
*Hartley McGuire*
|
|
185
248
|
|
|
186
|
-
|
|
249
|
+
* Remove `racc` dependency by manually writing `ActionDispatch::Journey::Scanner`.
|
|
187
250
|
|
|
188
|
-
*
|
|
251
|
+
*Gannon McGibbon*
|
|
252
|
+
|
|
253
|
+
* Speed up `ActionDispatch::Routing::Mapper::Scope#[]` by merging frame hashes.
|
|
189
254
|
|
|
190
255
|
*Gannon McGibbon*
|
|
191
256
|
|
|
192
|
-
*
|
|
257
|
+
* Allow bots to ignore `allow_browser`.
|
|
193
258
|
|
|
194
|
-
*
|
|
259
|
+
*Matthew Nguyen*
|
|
195
260
|
|
|
196
|
-
*
|
|
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
|
-
|
|
264
|
+
```ruby
|
|
265
|
+
# Before
|
|
266
|
+
get "/users", "/other_path", to: "users#index"
|
|
199
267
|
|
|
200
|
-
|
|
268
|
+
# After
|
|
269
|
+
get "/users", to: "users#index"
|
|
270
|
+
get "/other_path", to: "users#index"
|
|
271
|
+
```
|
|
201
272
|
|
|
202
|
-
*
|
|
273
|
+
*Gannon McGibbon*
|
|
203
274
|
|
|
204
|
-
*
|
|
275
|
+
* Make `http_cache_forever` use `immutable: true`
|
|
205
276
|
|
|
206
|
-
*
|
|
277
|
+
*Nate Matykiewicz*
|
|
207
278
|
|
|
208
|
-
*
|
|
279
|
+
* Add `config.action_dispatch.strict_freshness`.
|
|
209
280
|
|
|
210
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
287
|
+
*heka1024*
|
|
215
288
|
|
|
216
|
-
*
|
|
217
|
-
error with parallel system tests.
|
|
289
|
+
* Support `immutable` directive in Cache-Control
|
|
218
290
|
|
|
219
|
-
|
|
291
|
+
```ruby
|
|
292
|
+
expires_in 1.minute, public: true, immutable: true
|
|
293
|
+
# Cache-Control: public, max-age=60, immutable
|
|
294
|
+
```
|
|
220
295
|
|
|
221
|
-
*
|
|
296
|
+
*heka1024*
|
|
222
297
|
|
|
223
|
-
|
|
224
|
-
* Remove deprecated constant `ActionDispatch::IllegalStateError`.
|
|
298
|
+
* Add `:wasm_unsafe_eval` mapping for `content_security_policy`
|
|
225
299
|
|
|
226
|
-
|
|
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
|
-
*
|
|
308
|
+
*Joe Haig*
|
|
229
309
|
|
|
230
|
-
|
|
231
|
-
The result would be like this:
|
|
310
|
+
* Add `display_capture` and `keyboard_map` in `permissions_policy`
|
|
232
311
|
|
|
233
|
-
|
|
312
|
+
*Cyril Blaecke*
|
|
234
313
|
|
|
235
|
-
|
|
314
|
+
* Add `connect` route helper.
|
|
236
315
|
|
|
237
|
-
*
|
|
316
|
+
*Samuel Williams*
|
|
238
317
|
|
|
239
|
-
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
|