actionpack 8.0.3 → 8.1.0.beta1

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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +243 -168
  3. data/lib/abstract_controller/asset_paths.rb +4 -2
  4. data/lib/abstract_controller/base.rb +10 -2
  5. data/lib/abstract_controller/caching.rb +6 -3
  6. data/lib/abstract_controller/logger.rb +2 -1
  7. data/lib/action_controller/base.rb +1 -1
  8. data/lib/action_controller/caching.rb +1 -2
  9. data/lib/action_controller/form_builder.rb +1 -1
  10. data/lib/action_controller/log_subscriber.rb +7 -0
  11. data/lib/action_controller/metal/allow_browser.rb +1 -1
  12. data/lib/action_controller/metal/conditional_get.rb +25 -0
  13. data/lib/action_controller/metal/data_streaming.rb +1 -3
  14. data/lib/action_controller/metal/exceptions.rb +5 -0
  15. data/lib/action_controller/metal/flash.rb +1 -4
  16. data/lib/action_controller/metal/head.rb +3 -1
  17. data/lib/action_controller/metal/permissions_policy.rb +9 -0
  18. data/lib/action_controller/metal/rate_limiting.rb +22 -7
  19. data/lib/action_controller/metal/redirecting.rb +61 -5
  20. data/lib/action_controller/metal/renderers.rb +27 -6
  21. data/lib/action_controller/metal/rendering.rb +7 -1
  22. data/lib/action_controller/metal/request_forgery_protection.rb +18 -10
  23. data/lib/action_controller/metal/rescue.rb +9 -0
  24. data/lib/action_controller/railtie.rb +2 -6
  25. data/lib/action_dispatch/http/cache.rb +111 -1
  26. data/lib/action_dispatch/http/filter_parameters.rb +5 -3
  27. data/lib/action_dispatch/http/mime_types.rb +1 -0
  28. data/lib/action_dispatch/http/param_builder.rb +28 -27
  29. data/lib/action_dispatch/http/parameters.rb +3 -3
  30. data/lib/action_dispatch/http/permissions_policy.rb +4 -0
  31. data/lib/action_dispatch/http/query_parser.rb +12 -10
  32. data/lib/action_dispatch/http/request.rb +10 -5
  33. data/lib/action_dispatch/http/response.rb +16 -3
  34. data/lib/action_dispatch/http/url.rb +99 -3
  35. data/lib/action_dispatch/journey/gtg/simulator.rb +33 -12
  36. data/lib/action_dispatch/journey/gtg/transition_table.rb +33 -43
  37. data/lib/action_dispatch/journey/nodes/node.rb +2 -1
  38. data/lib/action_dispatch/journey/route.rb +45 -31
  39. data/lib/action_dispatch/journey/router/utils.rb +8 -14
  40. data/lib/action_dispatch/journey/router.rb +59 -81
  41. data/lib/action_dispatch/journey/routes.rb +7 -0
  42. data/lib/action_dispatch/journey/visitors.rb +55 -23
  43. data/lib/action_dispatch/journey/visualizer/fsm.js +4 -6
  44. data/lib/action_dispatch/middleware/cookies.rb +4 -2
  45. data/lib/action_dispatch/middleware/debug_exceptions.rb +7 -1
  46. data/lib/action_dispatch/middleware/debug_view.rb +11 -0
  47. data/lib/action_dispatch/middleware/exception_wrapper.rb +11 -5
  48. data/lib/action_dispatch/middleware/executor.rb +12 -2
  49. data/lib/action_dispatch/middleware/public_exceptions.rb +1 -5
  50. data/lib/action_dispatch/middleware/session/cache_store.rb +17 -0
  51. data/lib/action_dispatch/middleware/templates/rescues/_copy_button.html.erb +1 -0
  52. data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +3 -2
  53. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +9 -5
  54. data/lib/action_dispatch/middleware/templates/rescues/blocked_host.html.erb +1 -0
  55. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +1 -0
  56. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +1 -0
  57. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +50 -0
  58. data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb +1 -0
  59. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +1 -0
  60. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +1 -0
  61. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +1 -0
  62. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +1 -0
  63. data/lib/action_dispatch/railtie.rb +10 -2
  64. data/lib/action_dispatch/routing/inspector.rb +4 -1
  65. data/lib/action_dispatch/routing/mapper.rb +323 -173
  66. data/lib/action_dispatch/routing/route_set.rb +2 -4
  67. data/lib/action_dispatch/routing/routes_proxy.rb +0 -1
  68. data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +2 -2
  69. data/lib/action_dispatch/testing/assertions/response.rb +14 -0
  70. data/lib/action_dispatch/testing/assertions/routing.rb +11 -3
  71. data/lib/action_dispatch/testing/integration.rb +3 -2
  72. data/lib/action_pack/gem_version.rb +3 -3
  73. metadata +11 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b131da258151267320d978699cdc9ed60f96060bbeeb5bfa85f8da0ab648497f
4
- data.tar.gz: 2300ba0391c2e63f5e0ab71060bec7ef3e149d32064e5eccfd1a1f46ecad2820
3
+ metadata.gz: ed45caa459109b7c6009c7b63f8be21dfe1965dc7bc745e8e7588579a9384391
4
+ data.tar.gz: aabc44311112b16f6e9b8c3f34f391d1fc1abe91cb1b0df7e920dd0068cbc8b0
5
5
  SHA512:
6
- metadata.gz: 13ee7198d843341f8b97aa564b70385fd26ee5e3bdd2560e56cc20a16591d8502daa4befec55a81bc4783e5451648acf35dd67de6ca62cf0b41f5ae37cec9557
7
- data.tar.gz: 17972b2a557984ad9a96f3947135fe29dd6aae6dfd0a019204be60e0d82056ed390333bad574ae9ec8d762b24574f4aac8103e04d647fca3a75736763ecae9f6
6
+ metadata.gz: 05dc45165c2451cf7a0bd23c7b5baf55ba3e970cde0877211b208f227b98e538237c373135f5d8c3ba905c18af5834d69086ab8e223a11f7d77fed3f0e067746
7
+ data.tar.gz: 43cba6f2e00ce49bc0b4ef8172eb26b6571325dcfa5c8b5deebcec90cfad8f6d8d7d0804459dc29e5fd36073aa8f1b09348999e6258197360be3306d9c41134e
data/CHANGELOG.md CHANGED
@@ -1,285 +1,360 @@
1
- ## Rails 8.0.3 (September 22, 2025) ##
1
+ ## Rails 8.1.0.beta1 (September 04, 2025) ##
2
2
 
3
- * URL helpers for engines mounted at the application root handle `SCRIPT_NAME` correctly.
3
+ * Remove deprecated support to a route to multiple paths.
4
4
 
5
- Fixed an issue where `SCRIPT_NAME` is not applied to paths generated for routes in an engine
6
- mounted at "/".
7
-
8
- *Mike Dalessio*
5
+ *Rafael Mendonça França*
9
6
 
10
- * Fix `Rails.application.reload_routes!` from clearing almost all routes.
7
+ * Remove deprecated support for using semicolons as a query string separator.
11
8
 
12
- When calling `Rails.application.reload_routes!` inside a middleware of
13
- a Rake task, it was possible under certain conditions that all routes would be cleared.
14
- If ran inside a middleware, this would result in getting a 404 on most page you visit.
15
- This issue was only happening in development.
9
+ Before:
16
10
 
17
- *Edouard Chin*
11
+ ```ruby
12
+ ActionDispatch::QueryParser.each_pair("foo=bar;baz=quux").to_a
13
+ # => [["foo", "bar"], ["baz", "quux"]]
14
+ ```
18
15
 
19
- * Address `rack 3.2` deprecations warnings.
16
+ After:
20
17
 
18
+ ```ruby
19
+ ActionDispatch::QueryParser.each_pair("foo=bar;baz=quux").to_a
20
+ # => [["foo", "bar;baz=quux"]]
21
21
  ```
22
- warning: Status code :unprocessable_entity is deprecated and will be removed in a future version of Rack.
23
- Please use :unprocessable_content instead.
24
- ```
25
-
26
- Rails API will transparently convert one into the other for the foreseeable future.
27
22
 
28
- *Earlopain*, *Jean Boussier*
23
+ *Rafael Mendonça França*
29
24
 
30
- * Support hash-source in Content Security Policy.
25
+ * Remove deprecated support to skipping over leading brackets in parameter names in the parameter parser.
31
26
 
32
- *madogiwa*
27
+ Before:
33
28
 
34
- * Always return empty body for HEAD requests in `PublicExceptions` and
35
- `DebugExceptions`.
29
+ ```ruby
30
+ ActionDispatch::ParamBuilder.from_query_string("[foo]=bar") # => { "foo" => "bar" }
31
+ ActionDispatch::ParamBuilder.from_query_string("[foo][bar]=baz") # => { "foo" => { "bar" => "baz" } }
32
+ ```
36
33
 
37
- This is required by `Rack::Lint` (per RFC9110).
34
+ After:
38
35
 
39
- *Hartley McGuire*
36
+ ```ruby
37
+ ActionDispatch::ParamBuilder.from_query_string("[foo]=bar") # => { "[foo]" => "bar" }
38
+ ActionDispatch::ParamBuilder.from_query_string("[foo][bar]=baz") # => { "[foo]" => { "bar" => "baz" } }
39
+ ```
40
40
 
41
+ *Rafael Mendonça França*
41
42
 
42
- ## Rails 8.0.2.1 (August 13, 2025) ##
43
+ * Deprecate `Rails.application.config.action_dispatch.ignore_leading_brackets`.
43
44
 
44
- * No changes.
45
+ *Rafael Mendonça França*
45
46
 
46
- ## Rails 8.0.2 (March 12, 2025) ##
47
+ * Raise `ActionController::TooManyRequests` error from `ActionController::RateLimiting`
47
48
 
48
- * Improve `with_routing` test helper to not rebuild the middleware stack.
49
+ Requests that exceed the rate limit raise an `ActionController::TooManyRequests` error.
50
+ By default, Action Dispatch rescues the error and responds with a `429 Too Many Requests` status.
49
51
 
50
- Otherwise some middleware configuration could be lost.
52
+ *Sean Doyle*
51
53
 
52
- *Édouard Chin*
54
+ * Add .md/.markdown as Markdown extensions and add a default `markdown:` renderer:
53
55
 
54
- * Add resource name to the `ArgumentError` that's raised when invalid `:only` or `:except` options are given to `#resource` or `#resources`
56
+ ```ruby
57
+ class Page
58
+ def to_markdown
59
+ body
60
+ end
61
+ end
55
62
 
56
- This makes it easier to locate the source of the problem, especially for routes drawn by gems.
63
+ class PagesController < ActionController::Base
64
+ def show
65
+ @page = Page.find(params[:id])
57
66
 
58
- Before:
59
- ```
60
- :only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]
67
+ respond_to do |format|
68
+ format.html
69
+ format.md { render markdown: @page }
70
+ end
71
+ end
72
+ end
61
73
  ```
62
74
 
63
- After:
64
- ```
65
- Route `resources :products` - :only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]
66
- ```
75
+ *DHH*
67
76
 
68
- *Jeremy Green*
77
+ * Add headers to engine routes inspection command
69
78
 
70
- * Fix `url_for` to handle `:path_params` gracefully when it's not a `Hash`.
79
+ *Petrik de Heus*
71
80
 
72
- Prevents various security scanners from causing exceptions.
81
+ * Add "Copy as text" button to error pages
73
82
 
74
- *Martin Emde*
83
+ *Mikkel Malmberg*
75
84
 
76
- * Fix `ActionDispatch::Executor` to unwrap exceptions like other error reporting middlewares.
85
+ * Add `scope:` option to `rate_limit` method.
77
86
 
78
- *Jean Boussier*
87
+ Previously, it was not possible to share a rate limit count between several controllers, since the count was by
88
+ default separate for each controller.
79
89
 
90
+ Now, the `scope:` option solves this problem.
80
91
 
81
- ## Rails 8.0.1 (December 13, 2024) ##
92
+ ```ruby
93
+ class APIController < ActionController::API
94
+ rate_limit to: 2, within: 2.seconds, scope: "api"
95
+ end
96
+
97
+ class API::PostsController < APIController
98
+ # ...
99
+ end
82
100
 
83
- * Add `ActionDispatch::Request::Session#store` method to conform Rack spec.
101
+ class API::UsersController < APIController
102
+ # ...
103
+ end
104
+ ```
84
105
 
85
- *Yaroslav*
106
+ *ArthurPV*, *Kamil Hanus*
86
107
 
108
+ * Add support for `rack.response_finished` callbacks in ActionDispatch::Executor.
87
109
 
88
- ## Rails 8.0.0.1 (December 10, 2024) ##
110
+ The executor middleware now supports deferring completion callbacks to later
111
+ in the request lifecycle by utilizing Rack's `rack.response_finished` mechanism,
112
+ when available. This enables applications to define `rack.response_finished` callbacks
113
+ that may rely on state that would be cleaned up by the executor's completion callbacks.
89
114
 
90
- * Add validation to content security policies to disallow spaces and semicolons.
91
- Developers should use multiple arguments, and different directive methods instead.
115
+ *Adrianna Chang*, *Hartley McGuire*
92
116
 
93
- [CVE-2024-54133]
117
+ * Produce a log when `rescue_from` is invoked.
94
118
 
95
- *Gannon McGibbon*
119
+ *Steven Webb*, *Jean Boussier*
96
120
 
121
+ * Allow hosts redirects from `hosts` Rails configuration
97
122
 
98
- ## Rails 8.0.0 (November 07, 2024) ##
123
+ ```ruby
124
+ config.action_controller.allowed_redirect_hosts << "example.com"
125
+ ```
99
126
 
100
- * No changes.
127
+ *Kevin Robatel*
101
128
 
129
+ * `rate_limit.action_controller` notification has additional payload
102
130
 
103
- ## Rails 8.0.0.rc2 (October 30, 2024) ##
131
+ additional values: count, to, within, by, name, cache_key
104
132
 
105
- * Fix routes with `::` in the path.
133
+ *Jonathan Rochkind*
106
134
 
107
- *Rafael Mendonça França*
135
+ * Add JSON support to the built-in health controller.
108
136
 
109
- * Maintain Rack 2 parameter parsing behaviour.
137
+ The health controller now responds to JSON requests with a structured response
138
+ containing status and timestamp information. This makes it easier for monitoring
139
+ tools and load balancers to consume health check data programmatically.
110
140
 
111
- *Matthew Draper*
141
+ ```ruby
142
+ # /up.json
143
+ {
144
+ "status": "up",
145
+ "timestamp": "2025-09-19T12:00:00Z"
146
+ }
147
+ ```
112
148
 
149
+ *Francesco Loreti*, *Juan Vásquez*
113
150
 
114
- ## Rails 8.0.0.rc1 (October 19, 2024) ##
151
+ * Allow to open source file with a crash from the browser.
115
152
 
116
- * Remove `Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality`.
153
+ *Igor Kasyanchuk*
117
154
 
118
- *Rafael Mendonça França*
155
+ * Always check query string keys for valid encoding just like values are checked.
119
156
 
120
- * Improve `ActionController::TestCase` to expose a binary encoded `request.body`.
157
+ *Casper Smits*
121
158
 
122
- The rack spec clearly states:
159
+ * Always return empty body for HEAD requests in `PublicExceptions` and
160
+ `DebugExceptions`.
123
161
 
124
- > The input stream is an IO-like object which contains the raw HTTP POST data.
125
- > When applicable, its external encoding must be “ASCII-8BIT” and it must be opened in binary mode.
162
+ This is required by `Rack::Lint` (per RFC9110).
126
163
 
127
- Until now its encoding was generally UTF-8, which doesn't accurately reflect production
128
- behavior.
164
+ *Hartley McGuire*
129
165
 
130
- *Jean Boussier*
166
+ * Add comprehensive support for HTTP Cache-Control request directives according to RFC 9111.
131
167
 
132
- * Update `ActionController::AllowBrowser` to support passing method names to `:block`
168
+ Provides a `request.cache_control_directives` object that gives access to request cache directives:
133
169
 
134
170
  ```ruby
135
- class ApplicationController < ActionController::Base
136
- allow_browser versions: :modern, block: :handle_outdated_browser
171
+ # Boolean directives
172
+ request.cache_control_directives.only_if_cached? # => true/false
173
+ request.cache_control_directives.no_cache? # => true/false
174
+ request.cache_control_directives.no_store? # => true/false
175
+ request.cache_control_directives.no_transform? # => true/false
176
+
177
+ # Value directives
178
+ request.cache_control_directives.max_age # => integer or nil
179
+ request.cache_control_directives.max_stale # => integer or nil (or true for valueless max-stale)
180
+ request.cache_control_directives.min_fresh # => integer or nil
181
+ request.cache_control_directives.stale_if_error # => integer or nil
182
+
183
+ # Special helpers for max-stale
184
+ request.cache_control_directives.max_stale? # => true if max-stale present (with or without value)
185
+ request.cache_control_directives.max_stale_unlimited? # => true only for valueless max-stale
186
+ ```
137
187
 
138
- private
139
- def handle_outdated_browser
140
- render file: Rails.root.join("public/custom-error.html"), status: :not_acceptable
141
- end
188
+ Example usage:
189
+
190
+ ```ruby
191
+ def show
192
+ if request.cache_control_directives.only_if_cached?
193
+ @article = Article.find_cached(params[:id])
194
+ return head(:gateway_timeout) if @article.nil?
195
+ else
196
+ @article = Article.find(params[:id])
197
+ end
198
+
199
+ render :show
142
200
  end
143
201
  ```
144
202
 
145
- *Sean Doyle*
203
+ *egg528*
146
204
 
147
- * Raise an `ArgumentError` when invalid `:only` or `:except` options are passed into `#resource` and `#resources`.
205
+ * Add assert_in_body/assert_not_in_body as the simplest way to check if a piece of text is in the response body.
148
206
 
149
- *Joshua Young*
207
+ *DHH*
150
208
 
151
- ## Rails 8.0.0.beta1 (September 26, 2024) ##
209
+ * Include cookie name when calculating maximum allowed size.
152
210
 
153
- * Fix non-GET requests not updating cookies in `ActionController::TestCase`.
211
+ *Hartley McGuire*
154
212
 
155
- *Jon Moss*, *Hartley McGuire*
213
+ * Implement `must-understand` directive according to RFC 9111.
156
214
 
157
- * Update `ActionController::Live` to use a thread-pool to reuse threads across requests.
215
+ The `must-understand` directive indicates that a cache must understand the semantics of the response status code, or discard the response. This directive is enforced to be used only with `no-store` to ensure proper cache behavior.
158
216
 
159
- *Adam Renberg Tamm*
217
+ ```ruby
218
+ class ArticlesController < ApplicationController
219
+ def show
220
+ @article = Article.find(params[:id])
221
+
222
+ if @article.special_format?
223
+ must_understand
224
+ render status: 203 # Non-Authoritative Information
225
+ else
226
+ fresh_when @article
227
+ end
228
+ end
229
+ end
230
+ ```
160
231
 
161
- * Introduce safer, more explicit params handling method with `params#expect` such that
162
- `params.expect(table: [ :attr ])` replaces `params.require(:table).permit(:attr)`
232
+ *heka1024*
163
233
 
164
- Ensures params are filtered with consideration for the expected
165
- types of values, improving handling of params and avoiding ignorable
166
- errors caused by params tampering.
234
+ * The JSON renderer doesn't escape HTML entities or Unicode line separators anymore.
167
235
 
168
- ```ruby
169
- # If the url is altered to ?person=hacked
170
- # Before
171
- params.require(:person).permit(:name, :age, pets: [:name])
172
- # raises NoMethodError, causing a 500 and potential error reporting
236
+ Using `render json:` will no longer escape `<`, `>`, `&`, `U+2028` and `U+2029` characters that can cause errors
237
+ when the resulting JSON is embedded in JavaScript, or vulnerabilities when the resulting JSON is embedded in HTML.
173
238
 
174
- # After
175
- params.expect(person: [ :name, :age, pets: [[:name]] ])
176
- # raises ActionController::ParameterMissing, correctly returning a 400 error
177
- ```
239
+ Since the renderer is used to return a JSON document as `application/json`, it's typically not necessary to escape
240
+ those characters, and it improves performance.
178
241
 
179
- You may also notice the new double array `[[:name]]`. In order to
180
- declare when a param is expected to be an array of parameter hashes,
181
- this new double array syntax is used to explicitly declare an array.
182
- `expect` requires you to declare expected arrays in this way, and will
183
- ignore arrays that are passed when, for example, `pet: [:name]` is used.
242
+ Escaping will still occur when the `:callback` option is set, since the JSON is used as JavaScript code in this
243
+ situation (JSONP).
184
244
 
185
- In order to preserve compatibility, `permit` does not adopt the new
186
- double array syntax and is therefore more permissive about unexpected
187
- types. Using `expect` everywhere is recommended.
245
+ You can use the `:escape` option or set `config.action_controller.escape_json_responses` to `true` to restore the
246
+ escaping behavior.
188
247
 
189
- We suggest replacing `params.require(:person).permit(:name, :age)`
190
- with the direct replacement `params.expect(person: [:name, :age])`
191
- to prevent external users from manipulating params to trigger 500
192
- errors. A 400 error will be returned instead, using public/400.html
248
+ ```ruby
249
+ class PostsController < ApplicationController
250
+ def index
251
+ render json: Post.last(30), escape: true
252
+ end
253
+ end
254
+ ```
193
255
 
194
- Usage of `params.require(:id)` should likewise be replaced with
195
- `params.expect(:id)` which is designed to ensure that `params[:id]`
196
- is a scalar and not an array or hash, also requiring the param.
256
+ *Étienne Barrié*, *Jean Boussier*
197
257
 
198
- ```ruby
199
- # Before
200
- User.find(params.require(:id)) # allows an array, altering behavior
258
+ * Load lazy route sets before inserting test routes
201
259
 
202
- # After
203
- User.find(params.expect(:id)) # expect only returns non-blank permitted scalars (excludes Hash, Array, nil, "", etc)
204
- ```
260
+ Without loading lazy route sets early, we miss `after_routes_loaded` callbacks, or risk
261
+ invoking them with the test routes instead of the real ones if another load is triggered by an engine.
205
262
 
206
- *Martin Emde*
263
+ *Gannon McGibbon*
207
264
 
208
- * System Testing: Disable Chrome's search engine choice by default in system tests.
265
+ * Raise `AbstractController::DoubleRenderError` if `head` is called after rendering.
209
266
 
210
- *glaszig*
267
+ After this change, invoking `head` will lead to an error if response body is already set:
211
268
 
212
- * Fix `Request#raw_post` raising `NoMethodError` when `rack.input` is `nil`.
269
+ ```ruby
270
+ class PostController < ApplicationController
271
+ def index
272
+ render locals: {}
273
+ head :ok
274
+ end
275
+ end
276
+ ```
213
277
 
214
- *Hartley McGuire*
278
+ *Iaroslav Kurbatov*
215
279
 
216
- * Remove `racc` dependency by manually writing `ActionDispatch::Journey::Scanner`.
280
+ * The Cookie Serializer can now serialize an Active Support SafeBuffer when using message pack.
217
281
 
218
- *Gannon McGibbon*
282
+ Such code would previously produce an error if an application was using messagepack as its cookie serializer.
219
283
 
220
- * Speed up `ActionDispatch::Routing::Mapper::Scope#[]` by merging frame hashes.
284
+ ```ruby
285
+ class PostController < ApplicationController
286
+ def index
287
+ flash.notice = t(:hello_html) # This would try to serialize a SafeBuffer, which was not possible.
288
+ end
289
+ end
290
+ ```
221
291
 
222
- *Gannon McGibbon*
292
+ *Edouard Chin*
223
293
 
224
- * Allow bots to ignore `allow_browser`.
294
+ * Fix `Rails.application.reload_routes!` from clearing almost all routes.
225
295
 
226
- *Matthew Nguyen*
296
+ When calling `Rails.application.reload_routes!` inside a middleware of
297
+ a Rake task, it was possible under certain conditions that all routes would be cleared.
298
+ If ran inside a middleware, this would result in getting a 404 on most page you visit.
299
+ This issue was only happening in development.
227
300
 
228
- * Deprecate drawing routes with multiple paths to make routing faster.
229
- You may use `with_options` or a loop to make drawing multiple paths easier.
301
+ *Edouard Chin*
230
302
 
231
- ```ruby
232
- # Before
233
- get "/users", "/other_path", to: "users#index"
303
+ * Add resource name to the `ArgumentError` that's raised when invalid `:only` or `:except` options are given to `#resource` or `#resources`
234
304
 
235
- # After
236
- get "/users", to: "users#index"
237
- get "/other_path", to: "users#index"
305
+ This makes it easier to locate the source of the problem, especially for routes drawn by gems.
306
+
307
+ Before:
308
+ ```
309
+ :only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]
238
310
  ```
239
311
 
240
- *Gannon McGibbon*
312
+ After:
313
+ ```
314
+ Route `resources :products` - :only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]
315
+ ```
241
316
 
242
- * Make `http_cache_forever` use `immutable: true`
317
+ *Jeremy Green*
243
318
 
244
- *Nate Matykiewicz*
319
+ * A route pointing to a non-existing controller now returns a 500 instead of a 404.
245
320
 
246
- * Add `config.action_dispatch.strict_freshness`.
321
+ A controller not existing isn't a routing error that should result
322
+ in a 404, but a programming error that should result in a 500 and
323
+ be reported.
247
324
 
248
- When set to `true`, the `ETag` header takes precedence over the `Last-Modified` header when both are present,
249
- as specified by RFC 7232, Section 6.
325
+ Until recently, this was hard to untangle because of the support
326
+ for dynamic `:controller` segment in routes, but since this is
327
+ deprecated and will be removed in Rails 8.1, we can now easily
328
+ not consider missing controllers as routing errors.
250
329
 
251
- Defaults to `false` to maintain compatibility with previous versions of Rails, but is enabled as part of
252
- Rails 8.0 defaults.
330
+ *Jean Boussier*
253
331
 
254
- *heka1024*
332
+ * Add `check_collisions` option to `ActionDispatch::Session::CacheStore`.
255
333
 
256
- * Support `immutable` directive in Cache-Control
334
+ Newly generated session ids use 128 bits of randomness, which is more than
335
+ enough to ensure collisions can't happen, but if you need to harden sessions
336
+ even more, you can enable this option to check in the session store that the id
337
+ is indeed free you can enable that option. This however incurs an extra write
338
+ on session creation.
257
339
 
258
- ```ruby
259
- expires_in 1.minute, public: true, immutable: true
260
- # Cache-Control: public, max-age=60, immutable
261
- ```
340
+ *Shia*
262
341
 
263
- *heka1024*
342
+ * In ExceptionWrapper, match backtrace lines with built templates more often,
343
+ allowing improved highlighting of errors within do-end blocks in templates.
344
+ Fix for Ruby 3.4 to match new method labels in backtrace.
345
+
346
+ *Martin Emde*
264
347
 
265
- * Add `:wasm_unsafe_eval` mapping for `content_security_policy`
348
+ * Allow setting content type with a symbol of the Mime type.
266
349
 
267
350
  ```ruby
268
351
  # Before
269
- policy.script_src "'wasm-unsafe-eval'"
352
+ response.content_type = "text/html"
270
353
 
271
354
  # After
272
- policy.script_src :wasm_unsafe_eval
355
+ response.content_type = :html
273
356
  ```
274
357
 
275
- *Joe Haig*
276
-
277
- * Add `display_capture` and `keyboard_map` in `permissions_policy`
278
-
279
- *Cyril Blaecke*
280
-
281
- * Add `connect` route helper.
282
-
283
- *Samuel Williams*
358
+ *Petrik de Heus*
284
359
 
285
- Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/actionpack/CHANGELOG.md) for previous changes.
360
+ Please check [8-0-stable](https://github.com/rails/rails/blob/8-0-stable/actionpack/CHANGELOG.md) for previous changes.
@@ -7,8 +7,10 @@ module AbstractController
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  included do
10
- config_accessor :asset_host, :assets_dir, :javascripts_dir,
11
- :stylesheets_dir, :default_asset_host_protocol, :relative_url_root
10
+ singleton_class.delegate :asset_host, :asset_host=, :assets_dir, :assets_dir=, :javascripts_dir, :javascripts_dir=,
11
+ :stylesheets_dir, :stylesheets_dir=, :default_asset_host_protocol, :default_asset_host_protocol=, :relative_url_root, :relative_url_root=, to: :config
12
+ delegate :asset_host, :asset_host=, :assets_dir, :assets_dir=, :javascripts_dir, :javascripts_dir=,
13
+ :stylesheets_dir, :stylesheets_dir=, :default_asset_host_protocol, :default_asset_host_protocol=, :relative_url_root, :relative_url_root=, to: :config
12
14
  end
13
15
  end
14
16
  end
@@ -3,7 +3,6 @@
3
3
  # :markup: markdown
4
4
 
5
5
  require "abstract_controller/error"
6
- require "active_support/configurable"
7
6
  require "active_support/descendants_tracker"
8
7
  require "active_support/core_ext/module/anonymous"
9
8
  require "active_support/core_ext/module/attr_internal"
@@ -47,7 +46,7 @@ module AbstractController
47
46
  # Returns the formats that can be processed by the controller.
48
47
  attr_internal :formats
49
48
 
50
- include ActiveSupport::Configurable
49
+ class_attribute :config, instance_predicate: false, default: ActiveSupport::OrderedOptions.new
51
50
  extend ActiveSupport::DescendantsTracker
52
51
 
53
52
  class << self
@@ -65,6 +64,7 @@ module AbstractController
65
64
  unless klass.instance_variable_defined?(:@abstract)
66
65
  klass.instance_variable_set(:@abstract, false)
67
66
  end
67
+ klass.config = ActiveSupport::InheritableOptions.new(config)
68
68
  super
69
69
  end
70
70
 
@@ -121,6 +121,10 @@ module AbstractController
121
121
  @controller_path ||= name.delete_suffix("Controller").underscore unless anonymous?
122
122
  end
123
123
 
124
+ def configure # :nodoc:
125
+ yield config
126
+ end
127
+
124
128
  # Refresh the cached action_methods when a new action_method is added.
125
129
  def method_added(name)
126
130
  super
@@ -190,6 +194,10 @@ module AbstractController
190
194
  true
191
195
  end
192
196
 
197
+ def config # :nodoc:
198
+ @_config ||= self.class.config.inheritable_copy
199
+ end
200
+
193
201
  def inspect # :nodoc:
194
202
  "#<#{self.class.name}:#{'%#016x' % (object_id << 1)}>"
195
203
  end
@@ -32,13 +32,16 @@ module AbstractController
32
32
  included do
33
33
  extend ConfigMethods
34
34
 
35
- config_accessor :default_static_extension
35
+ singleton_class.delegate :default_static_extension, :default_static_extension=, to: :config
36
+ delegate :default_static_extension, :default_static_extension=, to: :config
36
37
  self.default_static_extension ||= ".html"
37
38
 
38
- config_accessor :perform_caching
39
+ singleton_class.delegate :perform_caching, :perform_caching=, to: :config
40
+ delegate :perform_caching, :perform_caching=, to: :config
39
41
  self.perform_caching = true if perform_caching.nil?
40
42
 
41
- config_accessor :enable_fragment_cache_logging
43
+ singleton_class.delegate :enable_fragment_cache_logging, :enable_fragment_cache_logging=, to: :config
44
+ delegate :enable_fragment_cache_logging, :enable_fragment_cache_logging=, to: :config
42
45
  self.enable_fragment_cache_logging = false
43
46
 
44
47
  class_attribute :_view_cache_dependencies, default: []
@@ -9,7 +9,8 @@ module AbstractController
9
9
  extend ActiveSupport::Concern
10
10
 
11
11
  included do
12
- config_accessor :logger
12
+ singleton_class.delegate :logger, :logger=, to: :config
13
+ delegate :logger, :logger=, to: :config
13
14
  include ActiveSupport::Benchmarkable
14
15
  end
15
16
  end
@@ -128,7 +128,7 @@ module ActionController
128
128
  #
129
129
  # Action Controller sends content to the user by using one of five rendering
130
130
  # methods. The most versatile and common is the rendering of a template.
131
- # Included in the Action Pack is the Action View, which enables rendering of ERB
131
+ # Also included with \Rails is Action View, which enables rendering of ERB
132
132
  # templates. It's automatically configured. The controller passes objects to the
133
133
  # view by assigning instance variables:
134
134
  #
@@ -9,9 +9,8 @@ module ActionController
9
9
  # of calculations, renderings, and database calls around for subsequent
10
10
  # requests.
11
11
  #
12
- # You can read more about each approach by clicking the modules below.
13
- #
14
12
  # Note: To turn off all caching provided by Action Controller, set
13
+ #
15
14
  # config.action_controller.perform_caching = false
16
15
  #
17
16
  # ## Caching stores