Clean CHANGELOG for 8.0
This commit is contained in:
parent
dc96d29d2b
commit
bf59d363fb
@ -1,21 +1,2 @@
|
||||
* Record ping on every Action Cable message.
|
||||
|
||||
Previously only `ping` and `welcome` message types were keeping the connection active.
|
||||
Now every Action Cable message updates the `pingedAt` value, preventing the connection
|
||||
from being marked as stale.
|
||||
|
||||
*yauhenininjia*
|
||||
|
||||
* Add two new assertion methods for Action Cable test cases: `assert_has_no_stream`
|
||||
and `assert_has_no_stream_for`. These methods can be used to assert that a
|
||||
stream has been stopped, e.g. via `stop_stream` or `stop_stream_for`. They complement
|
||||
the already existing `assert_has_stream` and `assert_has_stream_for` methods.
|
||||
|
||||
```ruby
|
||||
assert_has_no_stream "messages"
|
||||
assert_has_no_stream_for User.find(42)
|
||||
```
|
||||
|
||||
*Sebastian Pöll*, *Junichi Sato*
|
||||
|
||||
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/actioncable/CHANGELOG.md) for previous changes.
|
||||
|
@ -1,6 +1,2 @@
|
||||
* Fix all Action Mailbox database related models to respect
|
||||
`ActiveRecord::Base.table_name_prefix` configuration.
|
||||
|
||||
*Chedli Bourguiba*
|
||||
|
||||
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/actionmailbox/CHANGELOG.md) for previous changes.
|
||||
|
@ -1,9 +1,2 @@
|
||||
* Remove deprecated params via `:args` for `assert_enqueued_email_with`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `config.action_mailer.preview_path`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/actionmailer/CHANGELOG.md) for previous changes.
|
||||
|
@ -1,135 +1,2 @@
|
||||
* Fix `Mime::Type.parse` handling type parameters for HTTP Accept headers.
|
||||
|
||||
*Taylor Chaparro*
|
||||
|
||||
* Fix the error page that is displayed when a view template is missing to account for nested controller paths in the
|
||||
suggested correct location for the missing template.
|
||||
|
||||
*Joshua Young*
|
||||
|
||||
* Add `save_and_open_page` helper to IntegrationTest
|
||||
`save_and_open_page` is a helpful helper to keep a short feedback loop when working on system tests.
|
||||
A similar helper with matching signature has been added to integration tests.
|
||||
|
||||
*Joé Dupuis*
|
||||
|
||||
* Fix a regression in 7.1.3 passing a `to:` option without a controller when the controller is already defined by a scope.
|
||||
|
||||
```ruby
|
||||
Rails.application.routes.draw do
|
||||
controller :home do
|
||||
get "recent", to: "recent_posts"
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
*Étienne Barrié*
|
||||
|
||||
* Request Forgery takes relative paths into account.
|
||||
|
||||
*Stefan Wienert*
|
||||
|
||||
* Add ".test" as a default allowed host in development to ensure smooth golden-path setup with puma.dev.
|
||||
|
||||
*DHH*
|
||||
|
||||
* Add `allow_browser` to set minimum browser versions for the application.
|
||||
|
||||
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".
|
||||
|
||||
```ruby
|
||||
class ApplicationController < ActionController::Base
|
||||
# Allow only browsers natively supporting webp images, web push, badges, import maps, CSS nesting + :has
|
||||
allow_browser versions: :modern
|
||||
end
|
||||
|
||||
class ApplicationController < ActionController::Base
|
||||
# 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+.
|
||||
allow_browser versions: { safari: 16.4, firefox: 121, ie: false }
|
||||
end
|
||||
|
||||
class MessagesController < ApplicationController
|
||||
# In addition to the browsers blocked by ApplicationController, also block Opera below 104 and Chrome below 119 for the show action.
|
||||
allow_browser versions: { opera: 104, chrome: 119 }, only: :show
|
||||
end
|
||||
```
|
||||
|
||||
*DHH*
|
||||
|
||||
* Add rate limiting API.
|
||||
|
||||
```ruby
|
||||
class SessionsController < ApplicationController
|
||||
rate_limit to: 10, within: 3.minutes, only: :create
|
||||
end
|
||||
|
||||
class SignupsController < ApplicationController
|
||||
rate_limit to: 1000, within: 10.seconds,
|
||||
by: -> { request.domain }, with: -> { redirect_to busy_controller_url, alert: "Too many signups!" }, only: :new
|
||||
end
|
||||
```
|
||||
|
||||
*DHH*, *Jean Boussier*
|
||||
|
||||
* Add `image/svg+xml` to the compressible content types of ActionDispatch::Static
|
||||
|
||||
*Georg Ledermann*
|
||||
|
||||
* Add instrumentation for ActionController::Live#send_stream
|
||||
|
||||
Allows subscribing to `send_stream` events. The event payload contains the filename, disposition, and type.
|
||||
|
||||
*Hannah Ramadan*
|
||||
|
||||
* Add support for `with_routing` test helper in `ActionDispatch::IntegrationTest`
|
||||
|
||||
*Gannon McGibbon*
|
||||
|
||||
* Remove deprecated support to set `Rails.application.config.action_dispatch.show_exceptions` to `true` and `false`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `speaker`, `vibrate`, and `vr` permissions policy directives.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `Rails.application.config.action_dispatch.return_only_request_media_type_on_content_type`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Deprecate `Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated comparison between `ActionController::Parameters` and `Hash`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated constant `AbstractController::Helpers::MissingHelperError`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Fix a race condition that could cause a `Text file busy - chromedriver`
|
||||
error with parallel system tests
|
||||
|
||||
*Matt Brictson*
|
||||
|
||||
* Add `racc` as a dependency since it will become a bundled gem in Ruby 3.4.0
|
||||
|
||||
*Hartley McGuire*
|
||||
* Remove deprecated constant `ActionDispatch::IllegalStateError`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Add parameter filter capability for redirect locations.
|
||||
|
||||
It uses the `config.filter_parameters` to match what needs to be filtered.
|
||||
The result would be like this:
|
||||
|
||||
Redirected to http://secret.foo.bar?username=roque&password=[FILTERED]
|
||||
|
||||
Fixes #14055.
|
||||
|
||||
*Roque Pinel*, *Trevor Turk*, *tonytonyjan*
|
||||
|
||||
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/actionpack/CHANGELOG.md) for previous changes.
|
||||
|
@ -1,43 +1,2 @@
|
||||
* Use `includes` instead of `eager_load` for `with_all_rich_text`.
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
* Delegate `ActionText::Content#deconstruct` to `Nokogiri::XML::DocumentFragment#elements`
|
||||
|
||||
```ruby
|
||||
content = ActionText::Content.new <<~HTML
|
||||
<h1>Hello, world</h1>
|
||||
|
||||
<div>The body</div>
|
||||
HTML
|
||||
|
||||
content => [h1, div]
|
||||
|
||||
assert_pattern { h1 => { content: "Hello, world" } }
|
||||
assert_pattern { div => { content: "The body" } }
|
||||
```
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Fix all Action Text database related models to respect
|
||||
`ActiveRecord::Base.table_name_prefix` configuration.
|
||||
|
||||
*Chedli Bourguiba*
|
||||
|
||||
* Compile ESM package that can be used directly in the browser as actiontext.esm.js
|
||||
|
||||
*Matias Grunberg*
|
||||
|
||||
* Fix using actiontext.js with Sprockets
|
||||
|
||||
*Matias Grunberg*
|
||||
|
||||
* Upgrade Trix to 2.0.7
|
||||
|
||||
*Hartley McGuire*
|
||||
|
||||
* Fix using Trix with Sprockets
|
||||
|
||||
*Hartley McGuire*
|
||||
|
||||
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/actiontext/CHANGELOG.md) for previous changes.
|
||||
|
@ -1,97 +1,2 @@
|
||||
* Add queries count to template rendering instrumentation
|
||||
|
||||
```
|
||||
# Before
|
||||
Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms | Allocations: 112788)
|
||||
|
||||
# After
|
||||
Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms (2 queries, 1 cached) | Allocations: 112788)
|
||||
```
|
||||
|
||||
*fatkodima*
|
||||
|
||||
* Raise `ArgumentError` if `:renderable` object does not respond to `#render_in`
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Add the `nonce: true` option for `stylesheet_link_tag` helper to support automatic nonce generation for Content Security Policy.
|
||||
Works the same way as `javascript_include_tag nonce: true` does.
|
||||
|
||||
*Akhil G Krishnan*, *AJ Esler*
|
||||
|
||||
* Parse `ActionView::TestCase#rendered` HTML content as `Nokogiri::XML::DocumentFragment` instead of `Nokogiri::XML::Document`
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Rename `ActionView::TestCase::Behavior::Content` to `ActionView::TestCase::Behavior::RenderedViewContent`
|
||||
|
||||
Make `RenderedViewContent` inherit from `String`. Make private API with `:nodoc:`
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Deprecate passing `nil` as value for the `model:` argument to the `form_with` method.
|
||||
|
||||
*Collin Jilbert*
|
||||
|
||||
* Alias `field_set_tag` helper to `fieldset_tag` to match `<fieldset>` element
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Deprecate passing content to void elements when using `tag.br` type tag builders.
|
||||
|
||||
*Hartley McGuire*
|
||||
|
||||
* Fix the `number_to_human_size` view helper to correctly work with negative numbers.
|
||||
|
||||
*Earlopain*
|
||||
|
||||
* Automatically discard the implicit locals injected by collection rendering for template that can't accept them
|
||||
|
||||
When rendering a collection, two implicit variables are injected, which breaks templates with strict locals.
|
||||
|
||||
Now they are only passed if the template will actually accept them.
|
||||
|
||||
*Yasha Krasnou*, *Jean Boussier*
|
||||
|
||||
* Fix `@rails/ujs` calling `start()` an extra time when using bundlers
|
||||
|
||||
*Hartley McGuire*, *Ryunosuke Sato*
|
||||
|
||||
* Fix the `capture` view helper compatibility with HAML and Slim
|
||||
|
||||
When a blank string was captured in HAML or Slim (and possibly other template engines)
|
||||
it would instead return the entire buffer.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Updated `@rails/ujs` files to ignore certain data-* attributes when element is contenteditable.
|
||||
|
||||
This fix was already landed in >= 7.0.4.3, < 7.1.0.
|
||||
[[CVE-2023-23913](https://github.com/advisories/GHSA-xp5h-f8jf-rc8q)]
|
||||
|
||||
*Ryunosuke Sato*
|
||||
|
||||
* Added validation for HTML tag names in the `tag` and `content_tag` helper method. The `tag` and
|
||||
`content_tag` method now checks that the provided tag name adheres to the HTML specification. If
|
||||
an invalid HTML tag name is provided, the method raises an `ArgumentError` with an appropriate error
|
||||
message.
|
||||
|
||||
Examples:
|
||||
|
||||
```ruby
|
||||
# Raises ArgumentError: Invalid HTML5 tag name: 12p
|
||||
content_tag("12p") # Starting with a number
|
||||
|
||||
# Raises ArgumentError: Invalid HTML5 tag name: ""
|
||||
content_tag("") # Empty tag name
|
||||
|
||||
# Raises ArgumentError: Invalid HTML5 tag name: div/
|
||||
tag("div/") # Contains a solidus
|
||||
|
||||
# Raises ArgumentError: Invalid HTML5 tag name: "image file"
|
||||
tag("image file") # Contains a space
|
||||
```
|
||||
|
||||
*Akhil G Krishnan*
|
||||
|
||||
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/actionview/CHANGELOG.md) for previous changes.
|
||||
|
@ -1,65 +1,2 @@
|
||||
* All tests now respect the `active_job.queue_adapter` config
|
||||
|
||||
Previously if you had set `config.active_job.queue_adapter` in your `config/application.rb`
|
||||
or `config/environments/test.rb` file, the adapter you selected was previously not used consistently
|
||||
across all tests. In some tests your adapter would be used, but other tests would use the `TestAdapter`.
|
||||
|
||||
In Rails 7.2, all tests will respect the `queue_adapter` config if provided. If no config is provided,
|
||||
the `TestAdapter` will continue to be used.
|
||||
|
||||
See [#48585](https://github.com/rails/rails/pull/48585) for more details.
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Make Active Job transaction aware when used conjointly with Active Record.
|
||||
|
||||
A common mistake with Active Job is to enqueue jobs from inside a transaction,
|
||||
causing them to potentially be picked and ran by another process, before the
|
||||
transaction is committed, which may result in various errors.
|
||||
|
||||
```ruby
|
||||
Topic.transaction do
|
||||
topic = Topic.create(...)
|
||||
NewTopicNotificationJob.perform_later(topic)
|
||||
end
|
||||
```
|
||||
|
||||
Now Active Job will automatically defer the enqueuing to after the transaction is committed,
|
||||
and drop the job if the transaction is rolled back.
|
||||
|
||||
Various queue implementations can choose to disable this behavior, and users can disable it,
|
||||
or force it on a per job basis:
|
||||
|
||||
```ruby
|
||||
class NewTopicNotificationJob < ApplicationJob
|
||||
self.enqueue_after_transaction_commit = :never # or `:always` or `:default`
|
||||
end
|
||||
```
|
||||
|
||||
*Jean Boussier*, *Cristian Bica*
|
||||
|
||||
* Do not trigger immediate loading of `ActiveJob::Base` when loading `ActiveJob::TestHelper`.
|
||||
|
||||
*Maxime Réty*
|
||||
|
||||
* Preserve the serialized timezone when deserializing `ActiveSupport::TimeWithZone` arguments.
|
||||
|
||||
*Joshua Young*
|
||||
|
||||
* Remove deprecated `:exponentially_longer` value for the `:wait` in `retry_on`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support to set numeric values to `scheduled_at` attribute.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Deprecate `Rails.application.config.active_job.use_big_decimal_serialize`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated primitive serializer for `BigDecimal` arguments.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/activejob/CHANGELOG.md) for previous changes.
|
||||
|
@ -1,22 +1,2 @@
|
||||
* Fix a bug where type casting of string to `Time` and `DateTime` doesn't
|
||||
calculate minus minute value in TZ offset correctly.
|
||||
|
||||
*Akira Matsuda*
|
||||
|
||||
* Port the `type_for_attribute` method to Active Model. Classes that include
|
||||
`ActiveModel::Attributes` will now provide this method. This method behaves
|
||||
the same for Active Model as it does for Active Record.
|
||||
|
||||
```ruby
|
||||
class MyModel
|
||||
include ActiveModel::Attributes
|
||||
|
||||
attribute :my_attribute, :integer
|
||||
end
|
||||
|
||||
MyModel.type_for_attribute(:my_attribute) # => #<ActiveModel::Type::Integer ...>
|
||||
```
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/activemodel/CHANGELOG.md) for previous changes.
|
||||
|
@ -1,818 +1,2 @@
|
||||
* Support `touch_all` in batches.
|
||||
|
||||
```ruby
|
||||
Post.in_batches.touch_all
|
||||
```
|
||||
|
||||
*fatkodima*
|
||||
|
||||
* Add support for `:if_not_exists` and `:force` options to `create_schema`
|
||||
|
||||
*fatkodima*
|
||||
|
||||
* Fix `index_errors` having incorrect index in association validation errors.
|
||||
|
||||
*lulalala*
|
||||
|
||||
* Add `index_errors: :nested_attributes_order` mode.
|
||||
|
||||
This indexes the association validation errors based on the order received by nested attributes setter, and respects the `reject_if` configuration. This enables API to provide enough information to the frontend to map the validation errors back to their respective form fields.
|
||||
|
||||
*lulalala*
|
||||
|
||||
* Association option `query_constraints` is deprecated in favor of `foreign_key`.
|
||||
|
||||
*Nikita Vasilevsky*
|
||||
|
||||
* Add ENV["SKIP_TEST_DATABASE_TRUNCATE"] flag to speed up multi-process test runs on large DBs when all tests run within default txn. (This cuts ~10s from the test run of HEY when run by 24 processes against the 178 tables, since ~4,000 table truncates can then be skipped.)
|
||||
|
||||
*DHH*
|
||||
|
||||
* Added support for recursive common table expressions.
|
||||
|
||||
```ruby
|
||||
Post.with_recursive(
|
||||
post_and_replies: [
|
||||
Post.where(id: 42),
|
||||
Post.joins('JOIN post_and_replies ON posts.in_reply_to_id = post_and_replies.id'),
|
||||
]
|
||||
)
|
||||
```
|
||||
|
||||
Generates the following SQL:
|
||||
|
||||
```sql
|
||||
WITH RECURSIVE "post_and_replies" AS (
|
||||
(SELECT "posts".* FROM "posts" WHERE "posts"."id" = 42)
|
||||
UNION ALL
|
||||
(SELECT "posts".* FROM "posts" JOIN post_and_replies ON posts.in_reply_to_id = post_and_replies.id)
|
||||
)
|
||||
SELECT "posts".* FROM "posts"
|
||||
```
|
||||
|
||||
*ClearlyClaire*
|
||||
|
||||
* `validate_constraint` can be called in a `change_table` block.
|
||||
|
||||
ex:
|
||||
```ruby
|
||||
change_table :products do |t|
|
||||
t.check_constraint "price > discounted_price", name: "price_check", validate: false
|
||||
t.validate_check_constraint "price_check"
|
||||
end
|
||||
```
|
||||
|
||||
*Cody Cutrer*
|
||||
|
||||
* `PostgreSQLAdapter` now decodes columns of type date to `Date` instead of string.
|
||||
|
||||
Ex:
|
||||
```ruby
|
||||
ActiveRecord::Base.connection
|
||||
.select_value("select '2024-01-01'::date").class #=> Date
|
||||
```
|
||||
|
||||
*Joé Dupuis*
|
||||
|
||||
* Strict loading using `:n_plus_one_only` does not eagerly load child associations.
|
||||
|
||||
With this change, child associations are no longer eagerly loaded, to
|
||||
match intended behavior and to prevent non-deterministic order issues caused
|
||||
by calling methods like `first` or `last`. As `first` and `last` don't cause
|
||||
an N+1 by themselves, calling child associations will no longer raise.
|
||||
Fixes #49473.
|
||||
|
||||
Before:
|
||||
|
||||
```ruby
|
||||
person = Person.find(1)
|
||||
person.strict_loading!(mode: :n_plus_one_only)
|
||||
person.posts.first
|
||||
# SELECT * FROM posts WHERE person_id = 1; -- non-deterministic order
|
||||
person.posts.first.firm # raises ActiveRecord::StrictLoadingViolationError
|
||||
```
|
||||
|
||||
After:
|
||||
|
||||
```ruby
|
||||
person = Person.find(1)
|
||||
person.strict_loading!(mode: :n_plus_one_only)
|
||||
person.posts.first # this is 1+1, not N+1
|
||||
# SELECT * FROM posts WHERE person_id = 1 ORDER BY id LIMIT 1;
|
||||
person.posts.first.firm # no longer raises
|
||||
```
|
||||
|
||||
*Reid Lynch*
|
||||
|
||||
* Allow `Sqlite3Adapter` to use `sqlite3` gem version `2.x`
|
||||
|
||||
*Mike Dalessio*
|
||||
|
||||
* Allow `ActiveRecord::Base#pluck` to accept hash values
|
||||
|
||||
```ruby
|
||||
# Before
|
||||
Post.joins(:comments).pluck("posts.id", "comments.id", "comments.body")
|
||||
|
||||
# After
|
||||
Post.joins(:comments).pluck(posts: [:id], comments: [:id, :body])
|
||||
```
|
||||
|
||||
*fatkodima*
|
||||
|
||||
* Raise an `ActiveRecord::ActiveRecordError` error when the MySQL database returns an invalid version string.
|
||||
|
||||
*Kevin McPhillips*
|
||||
|
||||
* `ActiveRecord::Base.transaction` now yields an `ActiveRecord::Transaction` object.
|
||||
|
||||
This allows to register callbacks on it.
|
||||
|
||||
```ruby
|
||||
Article.transaction do |transaction|
|
||||
article.update(published: true)
|
||||
transaction.after_commit do
|
||||
PublishNotificationMailer.with(article: article).deliver_later
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Add `ActiveRecord::Base.current_transaction`.
|
||||
|
||||
Returns the current transaction, to allow registering callbacks on it.
|
||||
|
||||
```ruby
|
||||
Article.current_transaction.after_commit do
|
||||
PublishNotificationMailer.with(article: article).deliver_later
|
||||
end
|
||||
```
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Add `ActiveRecord.after_all_transactions_commit` callback.
|
||||
|
||||
Useful for code that may run either inside or outside a transaction and needs
|
||||
to perform work after the state changes have been properly persisted.
|
||||
|
||||
```ruby
|
||||
def publish_article(article)
|
||||
article.update(published: true)
|
||||
ActiveRecord.after_all_transactions_commit do
|
||||
PublishNotificationMailer.with(article: article).deliver_later
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
In the above example, the block is either executed immediately if called outside
|
||||
of a transaction, or called after the open transaction is committed.
|
||||
|
||||
If the transaction is rolled back, the block isn't called.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Add the ability to ignore counter cache columns until they are backfilled.
|
||||
|
||||
Starting to use counter caches on existing large tables can be troublesome, because the column
|
||||
values must be backfilled separately of the column addition (to not lock the table for too long)
|
||||
and before the use of `:counter_cache` (otherwise methods like `size`/`any?`/etc, which use
|
||||
counter caches internally, can produce incorrect results). People usually use database triggers
|
||||
or callbacks on child associations while backfilling before introducing a counter cache
|
||||
configuration to the association.
|
||||
|
||||
Now, to safely backfill the column, while keeping the column updated with child records added/removed, use:
|
||||
|
||||
```ruby
|
||||
class Comment < ApplicationRecord
|
||||
belongs_to :post, counter_cache: { active: false }
|
||||
end
|
||||
```
|
||||
|
||||
While the counter cache is not "active", the methods like `size`/`any?`/etc will not use it,
|
||||
but get the results directly from the database. After the counter cache column is backfilled, simply
|
||||
remove the `{ active: false }` part from the counter cache definition, and it will now be used by the
|
||||
mentioned methods.
|
||||
|
||||
*fatkodima*
|
||||
|
||||
* Retry known idempotent SELECT queries on connection-related exceptions.
|
||||
|
||||
SELECT queries we construct by walking the Arel tree and / or with known model attributes
|
||||
are idempotent and can safely be retried in the case of a connection error. Previously,
|
||||
adapters such as `TrilogyAdapter` would raise `ActiveRecord::ConnectionFailed: Trilogy::EOFError`
|
||||
when encountering a connection error mid-request.
|
||||
|
||||
*Adrianna Chang*
|
||||
|
||||
* Allow association's `foreign_key` to be composite.
|
||||
|
||||
`query_constraints` option was the only way to configure a composite foreign key by passing an `Array`.
|
||||
Now it's possible to pass an Array value as `foreign_key` to achieve the same behavior of an association.
|
||||
|
||||
*Nikita Vasilevsky*
|
||||
|
||||
* Allow association's `primary_key` to be composite.
|
||||
|
||||
Association's `primary_key` can be composite when derived from associated model `primary_key` or `query_constraints`.
|
||||
Now it's possible to explicitly set it as composite on the association.
|
||||
|
||||
*Nikita Vasilevsky*
|
||||
|
||||
* Add `config.active_record.permanent_connection_checkout` setting.
|
||||
|
||||
Controls whether `ActiveRecord::Base.connection` raises an error, emits a deprecation warning, or neither.
|
||||
|
||||
`ActiveRecord::Base.connection` checkouts a database connection from the pool and keeps it leased until the end of
|
||||
the request or job. This behavior can be undesirable in environments that use many more threads or fibers than there
|
||||
is available connections.
|
||||
|
||||
This configuration can be used to track down and eliminate code that calls `ActiveRecord::Base.connection` and
|
||||
migrate it to use `ActiveRecord::Base.with_connection` instead.
|
||||
|
||||
The default behavior remains unchanged, and there is currently no plans to change the default.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Add dirties option to uncached.
|
||||
|
||||
This adds a `dirties` option to `ActiveRecord::Base.uncached` and
|
||||
`ActiveRecord::ConnectionAdapters::ConnectionPool#uncached`.
|
||||
|
||||
When set to `true` (the default), writes will clear all query caches belonging to the current thread.
|
||||
When set to `false`, writes to the affected connection pool will not clear any query cache.
|
||||
|
||||
This is needed by Solid Cache so that cache writes do not clear query caches.
|
||||
|
||||
*Donal McBreen*
|
||||
|
||||
* Deprecate `ActiveRecord::Base.connection` in favor of `.lease_connection`.
|
||||
|
||||
The method has been renamed as `lease_connection` to better reflect that the returned
|
||||
connection will be held for the duration of the request or job.
|
||||
|
||||
This deprecation is a soft deprecation, no warnings will be issued and there is no
|
||||
current plan to remove the method.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Deprecate `ActiveRecord::ConnectionAdapters::ConnectionPool#connection`.
|
||||
|
||||
The method has been renamed as `lease_connection` to better reflect that the returned
|
||||
connection will be held for the duration of the request or job.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Expose a generic fixture accessor for fixture names that may conflict with Minitest.
|
||||
|
||||
```ruby
|
||||
assert_equal "Ruby on Rails", web_sites(:rubyonrails).name
|
||||
assert_equal "Ruby on Rails", fixture(:web_sites, :rubyonrails).name
|
||||
```
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Using `Model.query_constraints` with a single non-primary-key column used to raise as expected, but with an
|
||||
incorrect error message. This has been fixed to raise with a more appropriate error message.
|
||||
|
||||
*Joshua Young*
|
||||
|
||||
* Fix `has_one` association autosave setting the foreign key attribute when it is unchanged.
|
||||
|
||||
This behaviour is also inconsistent with autosaving `belongs_to` and can have unintended side effects like raising
|
||||
an `ActiveRecord::ReadOnlyAttributeError` when the foreign key attribute is marked as read-only.
|
||||
|
||||
*Joshua Young*
|
||||
|
||||
* Remove deprecated behavior that would rollback a transaction block when exited using `return`, `break` or `throw`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Deprecate `Rails.application.config.active_record.commit_transaction_on_non_local_return`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support to pass `rewhere` to `ActiveRecord::Relation#merge`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support to pass `deferrable: true` to `add_foreign_key`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support to quote `ActiveSupport::Duration`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `#quote_bound_value`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveRecord::ConnectionAdapters::ConnectionPool#connection_klass`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support to apply `#connection_pool_list`, `#active_connections?`, `#clear_active_connections!`,
|
||||
`#clear_reloadable_connections!`, `#clear_all_connections!` and `#flush_idle_connections!` to the connections pools
|
||||
for the current role when the `role` argument isn't provided.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `#all_connection_pools`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveRecord::ConnectionAdapters::SchemaCache#data_sources`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveRecord::ConnectionAdapters::SchemaCache.load_from`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `#all_foreign_keys_valid?` from database adapters.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support to passing coder and class as second argument to `serialize`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support to `ActiveRecord::Base#read_attribute(:id)` to return the custom primary key value.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `TestFixtures.fixture_path`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated behavior to support referring to a singular association by its plural name.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Deprecate `Rails.application.config.active_record.allow_deprecated_singular_associations_name`
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support to passing `SchemaMigration` and `InternalMetadata` classes as arguments to
|
||||
`ActiveRecord::MigrationContext`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveRecord::Migration.check_pending` method.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveRecord::LogSubscriber.runtime` method.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveRecord::LogSubscriber.runtime=` method.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveRecord::LogSubscriber.reset_runtime` method.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support to define `explain` in the connection adapter with 2 arguments.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveRecord::ActiveJobRequiredError`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveRecord::Base.clear_active_connections!`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveRecord::Base.clear_reloadable_connections!`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveRecord::Base.clear_all_connections!`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveRecord::Base.flush_idle_connections!`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `name` argument from `ActiveRecord::Base.remove_connection`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support to call `alias_attribute` with non-existent attribute names.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `Rails.application.config.active_record.suppress_multiple_database_warning`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Add ActiveRecord::Encryption::MessagePackMessageSerializer
|
||||
|
||||
Serialize data to the MessagePack format, for efficient storage in binary columns.
|
||||
|
||||
The binary encoding requires around 30% less space than the base64 encoding
|
||||
used by the default serializer.
|
||||
|
||||
*Donal McBreen*
|
||||
|
||||
* Add support for encrypting binary columns
|
||||
|
||||
Ensure encryption and decryption pass `Type::Binary::Data` around for binary data.
|
||||
|
||||
Previously encrypting binary columns with the `ActiveRecord::Encryption::MessageSerializer`
|
||||
incidentally worked for MySQL and SQLite, but not PostgreSQL.
|
||||
|
||||
*Donal McBreen*
|
||||
|
||||
* Deprecated `ENV["SCHEMA_CACHE"]` in favor of `schema_cache_path` in the database configuration.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Add `ActiveRecord::Base.with_connection` as a shortcut for leasing a connection for a short duration.
|
||||
|
||||
The leased connection is yielded, and for the duration of the block, any call to `ActiveRecord::Base.connection`
|
||||
will yield that same connection.
|
||||
|
||||
This is useful to perform a few database operations without causing a connection to be leased for the
|
||||
entire duration of the request or job.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Deprecate `config.active_record.warn_on_records_fetched_greater_than` now that `sql.active_record`
|
||||
notification includes `:row_count` field.
|
||||
|
||||
*Jason Nochlin*
|
||||
|
||||
* The fix ensures that the association is joined using the appropriate join type
|
||||
(either inner join or left outer join) based on the existing joins in the scope.
|
||||
|
||||
This prevents unintentional overrides of existing join types and ensures consistency in the generated SQL queries.
|
||||
|
||||
Example:
|
||||
|
||||
|
||||
|
||||
```ruby
|
||||
# `associated` will use `LEFT JOIN` instead of using `JOIN`
|
||||
Post.left_joins(:author).where.associated(:author)
|
||||
```
|
||||
|
||||
*Saleh Alhaddad*
|
||||
|
||||
* Fix an issue where `ActiveRecord::Encryption` configurations are not ready before the loading
|
||||
of Active Record models, when an application is eager loaded. As a result, encrypted attributes
|
||||
could be misconfigured in some cases.
|
||||
|
||||
*Maxime Réty*
|
||||
|
||||
* Deprecate defining an `enum` with keyword arguments.
|
||||
|
||||
```ruby
|
||||
class Function > ApplicationRecord
|
||||
# BAD
|
||||
enum color: [:red, :blue],
|
||||
type: [:instance, :class]
|
||||
|
||||
# GOOD
|
||||
enum :color, [:red, :blue]
|
||||
enum :type, [:instance, :class]
|
||||
end
|
||||
```
|
||||
|
||||
*Hartley McGuire*
|
||||
|
||||
* Add `config.active_record.validate_migration_timestamps` option for validating migration timestamps.
|
||||
|
||||
When set, validates that the timestamp prefix for a migration is no more than a day ahead of
|
||||
the timestamp associated with the current time. This is designed to prevent migrations prefixes
|
||||
from being hand-edited to future timestamps, which impacts migration generation and other
|
||||
migration commands.
|
||||
|
||||
*Adrianna Chang*
|
||||
|
||||
* Properly synchronize `Mysql2Adapter#active?` and `TrilogyAdapter#active?`
|
||||
|
||||
As well as `disconnect!` and `verify!`.
|
||||
|
||||
This generally isn't a big problem as connections must not be shared between
|
||||
threads, but is required when running transactional tests or system tests
|
||||
and could lead to a SEGV.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Support `:source_location` tag option for query log tags
|
||||
|
||||
```ruby
|
||||
config.active_record.query_log_tags << :source_location
|
||||
```
|
||||
|
||||
Calculating the caller location is a costly operation and should be used primarily in development
|
||||
(note, there is also a `config.active_record.verbose_query_logs` that serves the same purpose)
|
||||
or occasionally on production for debugging purposes.
|
||||
|
||||
*fatkodima*
|
||||
|
||||
* Add an option to `ActiveRecord::Encryption::Encryptor` to disable compression
|
||||
|
||||
Allow compression to be disabled by setting `compress: false`
|
||||
|
||||
```ruby
|
||||
class User
|
||||
encrypts :name, encryptor: ActiveRecord::Encryption::Encryptor.new(compress: false)
|
||||
end
|
||||
```
|
||||
|
||||
*Donal McBreen*
|
||||
|
||||
* Deprecate passing strings to `ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename`.
|
||||
|
||||
A `ActiveRecord::DatabaseConfigurations::DatabaseConfig` object should be passed instead.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Add row_count field to sql.active_record notification
|
||||
|
||||
This field returns the amount of rows returned by the query that emitted the notification.
|
||||
|
||||
This metric is useful in cases where one wants to detect queries with big result sets.
|
||||
|
||||
*Marvin Bitterlich*
|
||||
|
||||
* Consistently raise an `ArgumentError` when passing an invalid argument to a nested attributes association writer.
|
||||
|
||||
Previously, this would only raise on collection associations and produce a generic error on singular associations.
|
||||
|
||||
Now, it will raise on both collection and singular associations.
|
||||
|
||||
*Joshua Young*
|
||||
|
||||
* Fix single quote escapes on default generated MySQL columns
|
||||
|
||||
MySQL 5.7.5+ supports generated columns, which can be used to create a column that is computed from an expression.
|
||||
|
||||
Previously, the schema dump would output a string with double escapes for generated columns with single quotes in the default expression.
|
||||
|
||||
This would result in issues when importing the schema on a fresh instance of a MySQL database.
|
||||
|
||||
Now, the string will not be escaped and will be valid Ruby upon importing of the schema.
|
||||
|
||||
*Yash Kapadia*
|
||||
|
||||
* Fix Migrations with versions older than 7.1 validating options given to
|
||||
`add_reference` and `t.references`.
|
||||
|
||||
*Hartley McGuire*
|
||||
|
||||
* Add `<role>_types` class method to `ActiveRecord::DelegatedType` so that the delegated types can be introspected
|
||||
|
||||
*JP Rosevear*
|
||||
|
||||
* Make `schema_dump`, `query_cache`, `replica` and `database_tasks` configurable via `DATABASE_URL`
|
||||
|
||||
This wouldn't always work previously because boolean values would be interpreted as strings.
|
||||
|
||||
e.g. `DATABASE_URL=postgres://localhost/foo?schema_dump=false` now properly disable dumping the schema
|
||||
cache.
|
||||
|
||||
*Mike Coutermarsh*, *Jean Boussier*
|
||||
|
||||
* Introduce `ActiveRecord::Transactions::ClassMethods#set_callback`
|
||||
|
||||
It is identical to `ActiveSupport::Callbacks::ClassMethods#set_callback`
|
||||
but with support for `after_commit` and `after_rollback` callback options.
|
||||
|
||||
*Joshua Young*
|
||||
|
||||
* Make `ActiveRecord::Encryption::Encryptor` agnostic of the serialization format used for encrypted data.
|
||||
|
||||
Previously, the encryptor instance only allowed an encrypted value serialized as a `String` to be passed to the message serializer.
|
||||
|
||||
Now, the encryptor lets the configured `message_serializer` decide which types of serialized encrypted values are supported. A custom serialiser is therefore allowed to serialize `ActiveRecord::Encryption::Message` objects using a type other than `String`.
|
||||
|
||||
The default `ActiveRecord::Encryption::MessageSerializer` already ensures that only `String` objects are passed for deserialization.
|
||||
|
||||
*Maxime Réty*
|
||||
|
||||
* Fix `encrypted_attribute?` to take into account context properties passed to `encrypts`.
|
||||
|
||||
*Maxime Réty*
|
||||
|
||||
* The object returned by `explain` now responds to `pluck`, `first`,
|
||||
`last`, `average`, `count`, `maximum`, `minimum`, and `sum`. Those
|
||||
new methods run `EXPLAIN` on the corresponding queries:
|
||||
|
||||
```ruby
|
||||
User.all.explain.count
|
||||
# EXPLAIN SELECT COUNT(*) FROM `users`
|
||||
# ...
|
||||
|
||||
User.all.explain.maximum(:id)
|
||||
# EXPLAIN SELECT MAX(`users`.`id`) FROM `users`
|
||||
# ...
|
||||
```
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
* Fixes an issue where `validates_associated` `:on` option wasn't respected
|
||||
when validating associated records.
|
||||
|
||||
*Austen Madden*, *Alex Ghiculescu*, *Rafał Brize*
|
||||
|
||||
* Allow overriding SQLite defaults from `database.yml`.
|
||||
|
||||
Any PRAGMA configuration set under the `pragmas` key in the configuration
|
||||
file takes precedence over Rails' defaults, and additional PRAGMAs can be
|
||||
set as well.
|
||||
|
||||
```yaml
|
||||
database: storage/development.sqlite3
|
||||
timeout: 5000
|
||||
pragmas:
|
||||
journal_mode: off
|
||||
temp_store: memory
|
||||
```
|
||||
|
||||
*Stephen Margheim*
|
||||
|
||||
* Remove warning message when running SQLite in production, but leave it unconfigured.
|
||||
|
||||
There are valid use cases for running SQLite in production. However, it must be done
|
||||
with care, so instead of a warning most users won't see anyway, it's preferable to
|
||||
leave the configuration commented out to force them to think about having the database
|
||||
on a persistent volume etc.
|
||||
|
||||
*Jacopo Beschi*, *Jean Boussier*
|
||||
|
||||
* Add support for generated columns to the SQLite3 adapter.
|
||||
|
||||
Generated columns (both stored and dynamic) are supported since version 3.31.0 of SQLite.
|
||||
This adds support for those to the SQLite3 adapter.
|
||||
|
||||
```ruby
|
||||
create_table :users do |t|
|
||||
t.string :name
|
||||
t.virtual :name_upper, type: :string, as: 'UPPER(name)'
|
||||
t.virtual :name_lower, type: :string, as: 'LOWER(name)', stored: true
|
||||
end
|
||||
```
|
||||
|
||||
*Stephen Margheim*
|
||||
|
||||
* TrilogyAdapter: ignore `host` if `socket` parameter is set.
|
||||
|
||||
This allows to configure a connection on a UNIX socket via `DATABASE_URL`:
|
||||
|
||||
```
|
||||
DATABASE_URL=trilogy://does-not-matter/my_db_production?socket=/var/run/mysql.sock
|
||||
```
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Make `assert_queries_count`, `assert_no_queries`, `assert_queries_match`, and
|
||||
`assert_no_queries_match` assertions public.
|
||||
|
||||
To assert the expected number of queries are made, Rails internally uses `assert_queries_count` and
|
||||
`assert_no_queries`. To assert that specific SQL queries are made, `assert_queries_match` and
|
||||
`assert_no_queries_match` are used. These assertions can now be used in applications as well.
|
||||
|
||||
```ruby
|
||||
class ArticleTest < ActiveSupport::TestCase
|
||||
test "queries are made" do
|
||||
assert_queries_count(1) { Article.first }
|
||||
end
|
||||
|
||||
test "creates a foreign key" do
|
||||
assert_queries_match(/ADD FOREIGN KEY/i, include_schema: true) do
|
||||
@connection.add_foreign_key(:comments, :posts)
|
||||
end
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
*Petrik de Heus*, *fatkodima*
|
||||
|
||||
* Fix `has_secure_token` calls the setter method on initialize.
|
||||
|
||||
*Abeid Ahmed*
|
||||
|
||||
* When using a `DATABASE_URL`, allow for a configuration to map the protocol in the URL to a specific database
|
||||
adapter. This allows decoupling the adapter the application chooses to use from the database connection details
|
||||
set in the deployment environment.
|
||||
|
||||
```ruby
|
||||
# ENV['DATABASE_URL'] = "mysql://localhost/example_database"
|
||||
config.active_record.protocol_adapters.mysql = "trilogy"
|
||||
# will connect to MySQL using the trilogy adapter
|
||||
```
|
||||
|
||||
*Jean Boussier*, *Kevin McPhillips*
|
||||
|
||||
* In cases where MySQL returns `warning_count` greater than zero, but returns no warnings when
|
||||
the `SHOW WARNINGS` query is executed, `ActiveRecord.db_warnings_action` proc will still be
|
||||
called with a generic warning message rather than silently ignoring the warning(s).
|
||||
|
||||
*Kevin McPhillips*
|
||||
|
||||
* `DatabaseConfigurations#configs_for` accepts a symbol in the `name` parameter.
|
||||
|
||||
*Andrew Novoselac*
|
||||
|
||||
* Fix `where(field: values)` queries when `field` is a serialized attribute
|
||||
(for example, when `field` uses `ActiveRecord::Base.serialize` or is a JSON
|
||||
column).
|
||||
|
||||
*João Alves*
|
||||
|
||||
* Make the output of `ActiveRecord::Core#inspect` configurable.
|
||||
|
||||
By default, calling `inspect` on a record will yield a formatted string including just the `id`.
|
||||
|
||||
```ruby
|
||||
Post.first.inspect #=> "#<Post id: 1>"
|
||||
```
|
||||
|
||||
The attributes to be included in the output of `inspect` can be configured with
|
||||
`ActiveRecord::Core#attributes_for_inspect`.
|
||||
|
||||
```ruby
|
||||
Post.attributes_for_inspect = [:id, :title]
|
||||
Post.first.inspect #=> "#<Post id: 1, title: "Hello, World!">"
|
||||
```
|
||||
|
||||
With `attributes_for_inspect` set to `:all`, `inspect` will list all the record's attributes.
|
||||
|
||||
```ruby
|
||||
Post.attributes_for_inspect = :all
|
||||
Post.first.inspect #=> "#<Post id: 1, title: "Hello, World!", published_at: "2023-10-23 14:28:11 +0000">"
|
||||
```
|
||||
|
||||
In `development` and `test` mode, `attributes_for_inspect` will be set to `:all` by default.
|
||||
|
||||
You can also call `full_inspect` to get an inspection with all the attributes.
|
||||
|
||||
The attributes in `attribute_for_inspect` will also be used for `pretty_print`.
|
||||
|
||||
*Andrew Novoselac*
|
||||
|
||||
* Don't mark attributes as changed when reassigned to `Float::INFINITY` or
|
||||
`-Float::INFINITY`.
|
||||
|
||||
*Maicol Bentancor*
|
||||
|
||||
* Support the `RETURNING` clause for MariaDB.
|
||||
|
||||
*fatkodima*, *Nikolay Kondratyev*
|
||||
|
||||
* The SQLite3 adapter now implements the `supports_deferrable_constraints?` contract.
|
||||
|
||||
Allows foreign keys to be deferred by adding the `:deferrable` key to the `foreign_key` options.
|
||||
|
||||
```ruby
|
||||
add_reference :person, :alias, foreign_key: { deferrable: :deferred }
|
||||
add_reference :alias, :person, foreign_key: { deferrable: :deferred }
|
||||
```
|
||||
|
||||
*Stephen Margheim*
|
||||
|
||||
* Add the `set_constraints` helper to PostgreSQL connections.
|
||||
|
||||
```ruby
|
||||
Post.create!(user_id: -1) # => ActiveRecord::InvalidForeignKey
|
||||
|
||||
Post.transaction do
|
||||
Post.connection.set_constraints(:deferred)
|
||||
p = Post.create!(user_id: -1)
|
||||
u = User.create!
|
||||
p.user = u
|
||||
p.save!
|
||||
end
|
||||
```
|
||||
|
||||
*Cody Cutrer*
|
||||
|
||||
* Include `ActiveModel::API` in `ActiveRecord::Base`.
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Ensure `#signed_id` outputs `url_safe` strings.
|
||||
|
||||
*Jason Meller*
|
||||
|
||||
* Add `nulls_last` and working `desc.nulls_first` for MySQL.
|
||||
|
||||
*Tristan Fellows*
|
||||
|
||||
* Allow for more complex hash arguments for `order` which mimics `where` in `ActiveRecord::Relation`.
|
||||
|
||||
```ruby
|
||||
Topic.includes(:posts).order(posts: { created_at: :desc })
|
||||
```
|
||||
|
||||
*Myles Boone*
|
||||
|
||||
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md) for previous changes.
|
||||
|
@ -1,74 +1,2 @@
|
||||
* Remove deprecated `config.active_storage.silence_invalid_content_types_warning`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `config.active_storage.replace_on_assign_to_many`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Add support for custom `key` in `ActiveStorage::Blob#compose`.
|
||||
|
||||
*Elvin Efendiev*
|
||||
|
||||
* Add `image/webp` to `config.active_storage.web_image_content_types` when `load_defaults "7.2"`
|
||||
is set.
|
||||
|
||||
*Lewis Buckley*
|
||||
|
||||
* Fix JSON-encoding of `ActiveStorage::Filename` instances.
|
||||
|
||||
*Jonathan del Strother*
|
||||
|
||||
* Fix N+1 query when fetching preview images for non-image assets
|
||||
|
||||
*Aaron Patterson & Justin Searls*
|
||||
|
||||
* Fix all Active Storage database related models to respect
|
||||
`ActiveRecord::Base.table_name_prefix` configuration.
|
||||
|
||||
*Chedli Bourguiba*
|
||||
|
||||
* Fix `ActiveStorage::Representations::ProxyController` not returning the proper
|
||||
preview image variant for previewable files.
|
||||
|
||||
*Chedli Bourguiba*
|
||||
|
||||
* Fix `ActiveStorage::Representations::ProxyController` to proxy untracked
|
||||
variants.
|
||||
|
||||
*Chedli Bourguiba*
|
||||
|
||||
* When using the `preprocessed: true` option, avoid enqueuing transform jobs
|
||||
for blobs that are not representable.
|
||||
|
||||
*Chedli Bourguiba*
|
||||
|
||||
* Prevent `ActiveStorage::Blob#preview` to generate a variant if an empty variation is passed.
|
||||
Calls to `#url`, `#key` or `#download` will now use the original preview
|
||||
image instead of generating a variant with the exact same dimensions.
|
||||
|
||||
*Chedli Bourguiba*
|
||||
|
||||
* Process preview image variant when calling `ActiveStorage::Preview#processed`.
|
||||
For example, `attached_pdf.preview(:thumb).processed` will now immediately
|
||||
generate the full-sized preview image and the `:thumb` variant of it.
|
||||
Previously, the `:thumb` variant would not be generated until a further call
|
||||
to e.g. `processed.url`.
|
||||
|
||||
*Chedli Bourguiba* and *Jonathan Hefner*
|
||||
|
||||
* Prevent `ActiveRecord::StrictLoadingViolationError` when strict loading is
|
||||
enabled and the variant of an Active Storage preview has already been
|
||||
processed (for example, by calling `ActiveStorage::Preview#url`).
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Fix `preprocessed: true` option for named variants of previewable files.
|
||||
|
||||
*Nico Wenterodt*
|
||||
|
||||
* Allow accepting `service` as a proc as well in `has_one_attached` and `has_many_attached`.
|
||||
|
||||
*Yogesh Khater*
|
||||
|
||||
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/activestorage/CHANGELOG.md) for previous changes.
|
||||
|
@ -1,233 +1,2 @@
|
||||
* Support `duration` type in `ActiveSupport::XmlMini`.
|
||||
|
||||
*heka1024*
|
||||
|
||||
* Remove deprecated `ActiveSupport::Notifications::Event#children` and `ActiveSupport::Notifications::Event#parent_of?`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support to call the following methods without passing a deprecator:
|
||||
|
||||
- `deprecate`
|
||||
- `deprecate_constant`
|
||||
- `ActiveSupport::Deprecation::DeprecatedObjectProxy.new`
|
||||
- `ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new`
|
||||
- `ActiveSupport::Deprecation::DeprecatedConstantProxy.new`
|
||||
- `assert_deprecated`
|
||||
- `assert_not_deprecated`
|
||||
- `collect_deprecations`
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveSupport::Deprecation` delegation to instance.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `SafeBuffer#clone_empty`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `#to_default_s` from `Array`, `Date`, `DateTime` and `Time`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support to passing `Dalli::Client` instances to `MemCacheStore`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `config.active_support.use_rfc4122_namespaced_uuids`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `config.active_support.remove_deprecated_time_with_zone_name`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `config.active_support.disable_to_s_conversion`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support to bolding log text with positional boolean in `ActiveSupport::LogSubscriber#color`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated constants `ActiveSupport::LogSubscriber::CLEAR` and `ActiveSupport::LogSubscriber::BOLD`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated support for `config.active_support.cache_format_version = 6.1`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `:pool_size` and `:pool_timeout` options for the cache storage.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Warn on tests without assertions.
|
||||
|
||||
`ActiveSupport::TestCase` now warns when tests do not run any assertions.
|
||||
This is helpful in detecting broken tests that do not perform intended assertions.
|
||||
|
||||
*fatkodima*
|
||||
|
||||
* Support `hexBinary` type in `ActiveSupport::XmlMini`.
|
||||
|
||||
*heka1024*
|
||||
|
||||
* Deprecate `ActiveSupport::ProxyObject` in favor of Ruby's built-in `BasicObject`
|
||||
|
||||
*Earlopain*
|
||||
|
||||
* `stub_const` now accepts a `exists: false` parameter to allow stubbing missing constants.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Make ActiveSupport::BacktraceCleaner copy filters and silencers on dup and clone
|
||||
|
||||
Previously the copy would still share the internal silencers and filters array,
|
||||
causing state to leak.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Updating Astana with Western Kazakhstan TZInfo identifier
|
||||
|
||||
*Damian Nelson*
|
||||
|
||||
* Add filename support for `ActiveSupport::Logger.logger_outputs_to?`
|
||||
|
||||
```ruby
|
||||
logger = Logger.new('/var/log/rails.log')
|
||||
ActiveSupport::Logger.logger_outputs_to?(logger, '/var/log/rails.log')
|
||||
```
|
||||
|
||||
*Christian Schmidt*
|
||||
|
||||
* Include `IPAddr#prefix` when serializing an `IPAddr` using the
|
||||
`ActiveSupport::MessagePack` serializer. This change is backward and forward
|
||||
compatible — old payloads can still be read, and new payloads will be
|
||||
readable by older versions of Rails.
|
||||
|
||||
*Taiki Komaba*
|
||||
|
||||
* Add `default:` support for `ActiveSupport::CurrentAttributes.attribute`
|
||||
|
||||
```ruby
|
||||
class Current < ActiveSupport::CurrentAttributes
|
||||
attribute :counter, default: 0
|
||||
end
|
||||
```
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Remove deprecated support for the pre-Ruby 2.4 behavior of `to_time` returning a `Time` object with local timezone.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Deprecate `config.active_support.to_time_preserves_timezone`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Deprecate `DateAndTime::Compatibility.preserve_timezone`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Yield instance to `Object#with` block
|
||||
|
||||
```ruby
|
||||
client.with(timeout: 5_000) do |c|
|
||||
c.get("/commits")
|
||||
end
|
||||
```
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Use logical core count instead of physical core count to determine the
|
||||
default number of workers when parallelizing tests.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Fix `Time.now/DateTime.now/Date.today` to return results in a system timezone after `#travel_to`.
|
||||
|
||||
There is a bug in the current implementation of #travel_to:
|
||||
it remembers a timezone of its argument, and all stubbed methods start
|
||||
returning results in that remembered timezone. However, the expected
|
||||
behaviour is to return results in a system timezone.
|
||||
|
||||
*Aleksei Chernenkov*
|
||||
|
||||
* Add `ErrorReported#unexpected` to report precondition violations.
|
||||
|
||||
For example:
|
||||
|
||||
```ruby
|
||||
def edit
|
||||
if published?
|
||||
Rails.error.unexpected("[BUG] Attempting to edit a published article, that shouldn't be possible")
|
||||
return false
|
||||
end
|
||||
# ...
|
||||
end
|
||||
```
|
||||
|
||||
The above will raise an error in development and test, but only report the error in production.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Make the order of read_multi and write_multi notifications for `Cache::Store#fetch_multi` operations match the order they are executed in.
|
||||
|
||||
*Adam Renberg Tamm*
|
||||
|
||||
* Make return values of `Cache::Store#write` consistent.
|
||||
|
||||
The return value was not specified before. Now it returns `true` on a successful write,
|
||||
`nil` if there was an error talking to the cache backend, and `false` if the write failed
|
||||
for another reason (e.g. the key already exists and `unless_exist: true` was passed).
|
||||
|
||||
*Sander Verdonschot*
|
||||
|
||||
* Fix logged cache keys not always matching actual key used by cache action.
|
||||
|
||||
*Hartley McGuire*
|
||||
|
||||
* Improve error messages of `assert_changes` and `assert_no_changes`
|
||||
|
||||
`assert_changes` error messages now display objects with `.inspect` to make it easier
|
||||
to differentiate nil from empty strings, strings from symbols, etc.
|
||||
`assert_no_changes` error messages now surface the actual value.
|
||||
|
||||
*pcreux*
|
||||
|
||||
* Fix `#to_fs(:human_size)` to correctly work with negative numbers.
|
||||
|
||||
*Earlopain*
|
||||
|
||||
* Fix `BroadcastLogger#dup` so that it duplicates the logger's `broadcasts`.
|
||||
|
||||
*Andrew Novoselac*
|
||||
|
||||
* Fix issue where `bootstrap.rb` overwrites the `level` of a `BroadcastLogger`'s `broadcasts`.
|
||||
|
||||
*Andrew Novoselac*
|
||||
|
||||
* Fix compatibility with the `semantic_logger` gem.
|
||||
|
||||
The `semantic_logger` gem doesn't behave exactly like stdlib logger in that
|
||||
`SemanticLogger#level` returns a Symbol while stdlib `Logger#level` returns an Integer.
|
||||
|
||||
This caused the various `LogSubscriber` classes in Rails to break when assigned a
|
||||
`SemanticLogger` instance.
|
||||
|
||||
*Jean Boussier*, *ojab*
|
||||
|
||||
* Fix MemoryStore to prevent race conditions when incrementing or decrementing.
|
||||
|
||||
*Pierre Jambet*
|
||||
|
||||
* Implement `HashWithIndifferentAccess#to_proc`.
|
||||
|
||||
Previously, calling `#to_proc` on `HashWithIndifferentAccess` object used inherited `#to_proc`
|
||||
method from the `Hash` class, which was not able to access values using indifferent keys.
|
||||
|
||||
*fatkodima*
|
||||
|
||||
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/activesupport/CHANGELOG.md) for previous changes.
|
||||
|
@ -1,337 +1,2 @@
|
||||
* Defer route drawing to the first request, or when url_helpers are called
|
||||
|
||||
Executes the first routes reload in middleware, or when a route set's
|
||||
url_helpers receives a route call / asked if it responds to a route.
|
||||
Previously, this was executed unconditionally on boot, which can
|
||||
slow down boot time unnecessarily for larger apps with lots of routes.
|
||||
|
||||
*Gannon McGibbon*
|
||||
|
||||
* Add options to bin/rails app:update.
|
||||
|
||||
`bin/rails app:update` now supports the same generic options that generators do:
|
||||
|
||||
* `--force`: Accept all changes to existing files
|
||||
* `--skip`: Refuse all changes to existing files
|
||||
* `--pretend`: Don't make any changes
|
||||
* `--quiet`: Don't output all changes made
|
||||
|
||||
*Étienne Barrié*
|
||||
|
||||
* Implement Rails console commands and helpers with IRB v1.13's extension APIs
|
||||
|
||||
Rails console users will now see `helper`, `controller`, `new_session`, and `app` under
|
||||
IRB help message's `Helper methods` category. And `reload!` command will be displayed under
|
||||
the new `Rails console` commands category.
|
||||
|
||||
Prior to this change, Rails console's commands and helper methods are added through IRB's
|
||||
private components and don't show up in its help message, which led to poor discoverability.
|
||||
|
||||
*Stan Lo*
|
||||
|
||||
* Remove deprecated `Rails::Generators::Testing::Behaviour`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `find_cmd_and_exec` console helper.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `Rails.config.enable_dependency_loading`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `Rails.application.secrets`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Generated Gemfile will include `require: "debug/prelude"` for the `debug` gem
|
||||
|
||||
Requiring `debug` gem directly automatically activates it, which could introduce
|
||||
additional overhead and memory usage even without entering a debugging session.
|
||||
|
||||
By making Bundler require `debug/prelude` instead, developers can keep their access
|
||||
to breakpoint methods like `debugger` or `binding.break`, but the debugger won't be
|
||||
activated until a breakpoint is hit.
|
||||
|
||||
*Stan Lo*
|
||||
|
||||
* Allow Actionable Errors encountered when running tests to be retried.
|
||||
|
||||
```txt
|
||||
Migrations are pending. To resolve this issue, run:
|
||||
|
||||
bin/rails db:migrate
|
||||
|
||||
You have 1 pending migration:
|
||||
|
||||
db/migrate/20240201213806_add_a_to_b.rb
|
||||
Run pending migrations? [Yn] Y
|
||||
== 20240201213806 AddAToB: migrating =========================================
|
||||
== 20240201213806 AddAToB: migrated (0.0000s) ================================
|
||||
|
||||
Running 7 tests in a single process (parallelization threshold is 50)
|
||||
Run options: --seed 22200
|
||||
|
||||
# Running:
|
||||
|
||||
.......
|
||||
|
||||
Finished in 0.243394s, 28.7600 runs/s, 45.1942 assertions/s.
|
||||
7 runs, 11 assertions, 0 failures, 0 errors, 0 skips
|
||||
```
|
||||
|
||||
This feature will only be present on interactive terminals.
|
||||
|
||||
*Andrew Novoselac & Gannon McGibbon*
|
||||
|
||||
* Skip generating a `test` job in ci.yml when a new application is generated with the
|
||||
`--skip-test` option.
|
||||
|
||||
*Steve Polito*
|
||||
|
||||
* Update the `.node-version` file conditionally generated for new applications to 20.11.1
|
||||
|
||||
*Steve Polito*
|
||||
|
||||
* Fix sanitizer vendor configuration in 7.1 defaults.
|
||||
|
||||
In apps where rails-html-sanitizer was not eagerly loaded, the sanitizer default could end up
|
||||
being Rails::HTML4::Sanitizer when it should be set to Rails::HTML5::Sanitizer.
|
||||
|
||||
*Mike Dalessio*, *Rafael Mendonça França*
|
||||
|
||||
* Set `action_mailer.default_url_options` values in `development` and `test`.
|
||||
|
||||
Prior to this commit, new Rails applications would raise `ActionView::Template::Error`
|
||||
if a mailer included a url built with a `*_path` helper.
|
||||
|
||||
*Steve Polito*
|
||||
|
||||
* Introduce `Rails::Generators::Testing::Assertions#assert_initializer`
|
||||
|
||||
Compliments the existing `initializer` generator action.
|
||||
|
||||
```rb
|
||||
assert_initializer "mail_interceptors.rb"
|
||||
```
|
||||
|
||||
*Steve Polito*
|
||||
|
||||
* Generate a .devcontainer folder and its contents when creating a new app.
|
||||
|
||||
The .devcontainer folder includes everything needed to boot the app and do development in a remote container.
|
||||
|
||||
The container setup includes:
|
||||
- A redis container for Kredis, ActionCable etc.
|
||||
- A database (SQLite, Postgres, MySQL or MariaDB)
|
||||
- A Headless chrome container for system tests
|
||||
- Active Storage configured to use the local disk and with preview features working
|
||||
|
||||
If any of these options are skipped in the app setup they will not be included in the container configuration.
|
||||
|
||||
These files can be skipped using the `--skip-devcontainer` option.
|
||||
|
||||
*Andrew Novoselac & Rafael Mendonça França*
|
||||
|
||||
* Introduce `SystemTestCase#served_by` for configuring the System Test application server
|
||||
|
||||
By default this is localhost. This method allows the host and port to be specified manually.
|
||||
|
||||
```ruby
|
||||
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
|
||||
served_by host: "testserver", port: 45678
|
||||
end
|
||||
```
|
||||
|
||||
*Andrew Novoselac & Rafael Mendonça França*
|
||||
|
||||
* `bin/rails test` will no longer load files named `*_test.rb` if they are located in the `fixtures` folder.
|
||||
|
||||
*Edouard Chin*
|
||||
|
||||
* Ensure logger tags configured with `config.log_tags` are still active in `request.action_dispatch` handlers
|
||||
|
||||
*KJ Tsanaktsidis*
|
||||
|
||||
* Setup jemalloc in the default Dockerfile for memory optimization.
|
||||
|
||||
*Matt Almeida*, *Jean Boussier*
|
||||
|
||||
* Commented out lines in .railsrc file should not be treated as arguments when using
|
||||
rails new generator command. Update ARGVScrubber to ignore text after # symbols.
|
||||
|
||||
*Willian Tenfen*
|
||||
|
||||
* Skip CSS when generating APIs.
|
||||
|
||||
*Ruy Rocha*
|
||||
|
||||
* Rails console now indicates application name and the current Rails environment:
|
||||
|
||||
```txt
|
||||
my-app(dev)> # for RAILS_ENV=development
|
||||
my-app(test)> # for RAILS_ENV=test
|
||||
my-app(prod)> # for RAILS_ENV=production
|
||||
my-app(my_env)> # for RAILS_ENV=my_env
|
||||
```
|
||||
|
||||
The application name is derived from the application's module name from `config/application.rb`.
|
||||
For example, `MyApp` will displayed as `my-app` in the prompt.
|
||||
|
||||
Additionally, the environment name will be colorized when the environment is
|
||||
`development` (blue), `test` (blue), or `production` (red), if your
|
||||
terminal supports it.
|
||||
|
||||
*Stan Lo*
|
||||
|
||||
* Ensure `autoload_paths`, `autoload_once_paths`, `eager_load_paths`, and
|
||||
`load_paths` only have directories when initialized from engine defaults.
|
||||
Previously, files under the `app` directory could end up there too.
|
||||
|
||||
*Takumasa Ochi*
|
||||
|
||||
* Prevent unnecessary application reloads in development.
|
||||
|
||||
Previously, some files outside autoload paths triggered unnecessary reloads.
|
||||
With this fix, application reloads according to `Rails.autoloaders.main.dirs`,
|
||||
thereby preventing unnecessary reloads.
|
||||
|
||||
*Takumasa Ochi*
|
||||
|
||||
* Use `oven-sh/setup-bun` in GitHub CI when generating an app with Bun.
|
||||
|
||||
*TangRufus*
|
||||
|
||||
* Disable `pidfile` generation in the `production` environment.
|
||||
|
||||
*Hans Schnedlitz*
|
||||
|
||||
* Set `config.action_view.annotate_rendered_view_with_filenames` to `true` in
|
||||
the `development` environment.
|
||||
|
||||
*Adrian Marin*
|
||||
|
||||
* Support the `BACKTRACE` environment variable to turn off backtrace cleaning.
|
||||
|
||||
Useful for debugging framework code:
|
||||
|
||||
```sh
|
||||
BACKTRACE=1 bin/rails server
|
||||
```
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Raise `ArgumentError` when reading `config.x.something` with arguments:
|
||||
|
||||
```ruby
|
||||
config.x.this_works.this_raises true # raises ArgumentError
|
||||
```
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Add default PWA files for manifest and service-worker that are served from `app/views/pwa` and can be dynamically rendered through ERB. Mount these files explicitly at the root with default routes in the generated routes file.
|
||||
|
||||
*DHH*
|
||||
|
||||
* Updated system tests to now use headless Chrome by default for the new applications.
|
||||
|
||||
*DHH*
|
||||
|
||||
* Add GitHub CI files for Dependabot, Brakeman, RuboCop, and running tests by default. Can be skipped with `--skip-ci`.
|
||||
|
||||
*DHH*
|
||||
|
||||
* Add Brakeman by default for static analysis of security vulnerabilities. Allow skipping with `--skip-brakeman option`.
|
||||
|
||||
*vipulnsward*
|
||||
|
||||
* Add RuboCop with rules from `rubocop-rails-omakase` by default. Skip with `--skip-rubocop`.
|
||||
|
||||
*DHH* and *zzak*
|
||||
|
||||
* Use `bin/rails runner --skip-executor` to not wrap the runner script with an
|
||||
Executor.
|
||||
|
||||
*Ben Sheldon*
|
||||
|
||||
* Fix isolated engines to take `ActiveRecord::Base.table_name_prefix` into consideration.
|
||||
This will allow for engine defined models, such as inside Active Storage, to respect
|
||||
Active Record table name prefix configuration.
|
||||
|
||||
*Chedli Bourguiba*
|
||||
|
||||
* Fix running `db:system:change` when the app has no Dockerfile.
|
||||
|
||||
*Hartley McGuire*
|
||||
|
||||
* In Action Mailer previews, list inline attachments separately from normal
|
||||
attachments. For example, attachments that were previously listed like
|
||||
|
||||
> Attachments: logo.png file1.pdf file2.pdf
|
||||
|
||||
will now be listed like
|
||||
|
||||
> Attachments: file1.pdf file2.pdf (Inline: logo.png)
|
||||
|
||||
*Christian Schmidt* and *Jonathan Hefner*
|
||||
|
||||
* In mailer preview, only show SMTP-To if it differs from the union of To, Cc and Bcc.
|
||||
|
||||
*Christian Schmidt*
|
||||
|
||||
* Enable YJIT by default on new applications running Ruby 3.3+.
|
||||
|
||||
Adds a `config/initializers/enable_yjit.rb` initializer that enables YJIT
|
||||
when running on Ruby 3.3+.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* In Action Mailer previews, show date from message `Date` header if present.
|
||||
|
||||
*Sampat Badhe*
|
||||
|
||||
* Exit with non-zero status when the migration generator fails.
|
||||
|
||||
*Katsuhiko YOSHIDA*
|
||||
|
||||
* Use numeric UID and GID in Dockerfile template
|
||||
|
||||
The Dockerfile generated by `rails new` sets the default user and group
|
||||
by name instead of UID:GID. This can cause the following error in Kubernetes:
|
||||
|
||||
```
|
||||
container has runAsNonRoot and image has non-numeric user (rails), cannot verify user is non-root
|
||||
```
|
||||
|
||||
This change sets default user and group by their numeric values.
|
||||
|
||||
*Ivan Fedotov*
|
||||
|
||||
* Disallow invalid values for rails new options.
|
||||
|
||||
The `--database`, `--asset-pipeline`, `--css`, and `--javascript` options
|
||||
for `rails new` take different arguments. This change validates them.
|
||||
|
||||
*Tony Drake*, *Akhil G Krishnan*, *Petrik de Heus*
|
||||
|
||||
* Conditionally print `$stdout` when invoking `run_generator`.
|
||||
|
||||
In an effort to improve the developer experience when debugging
|
||||
generator tests, we add the ability to conditionally print `$stdout`
|
||||
instead of capturing it.
|
||||
|
||||
This allows for calls to `binding.irb` and `puts` work as expected.
|
||||
|
||||
```sh
|
||||
RAILS_LOG_TO_STDOUT=true ./bin/test test/generators/actions_test.rb
|
||||
```
|
||||
|
||||
*Steve Polito*
|
||||
|
||||
* Remove the option `config.public_file_server.enabled` from the generators
|
||||
for all environments, as the value is the same in all environments.
|
||||
|
||||
*Adrian Hirt*
|
||||
|
||||
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/railties/CHANGELOG.md) for previous changes.
|
||||
|
Loading…
Reference in New Issue
Block a user