mirror of https://github.com/rails/rails
parent
e57a936879
commit
fb6c6007d0
108
Gemfile.lock
108
Gemfile.lock
|
@ -20,70 +20,70 @@ GIT
|
|||
PATH
|
||||
remote: .
|
||||
specs:
|
||||
actioncable (7.1.0.rc1)
|
||||
actionpack (= 7.1.0.rc1)
|
||||
activesupport (= 7.1.0.rc1)
|
||||
actioncable (7.2.0.alpha)
|
||||
actionpack (= 7.2.0.alpha)
|
||||
activesupport (= 7.2.0.alpha)
|
||||
nio4r (~> 2.0)
|
||||
websocket-driver (>= 0.6.1)
|
||||
zeitwerk (~> 2.6)
|
||||
actionmailbox (7.1.0.rc1)
|
||||
actionpack (= 7.1.0.rc1)
|
||||
activejob (= 7.1.0.rc1)
|
||||
activerecord (= 7.1.0.rc1)
|
||||
activestorage (= 7.1.0.rc1)
|
||||
activesupport (= 7.1.0.rc1)
|
||||
actionmailbox (7.2.0.alpha)
|
||||
actionpack (= 7.2.0.alpha)
|
||||
activejob (= 7.2.0.alpha)
|
||||
activerecord (= 7.2.0.alpha)
|
||||
activestorage (= 7.2.0.alpha)
|
||||
activesupport (= 7.2.0.alpha)
|
||||
mail (>= 2.7.1)
|
||||
net-imap
|
||||
net-pop
|
||||
net-smtp
|
||||
actionmailer (7.1.0.rc1)
|
||||
actionpack (= 7.1.0.rc1)
|
||||
actionview (= 7.1.0.rc1)
|
||||
activejob (= 7.1.0.rc1)
|
||||
activesupport (= 7.1.0.rc1)
|
||||
actionmailer (7.2.0.alpha)
|
||||
actionpack (= 7.2.0.alpha)
|
||||
actionview (= 7.2.0.alpha)
|
||||
activejob (= 7.2.0.alpha)
|
||||
activesupport (= 7.2.0.alpha)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
net-imap
|
||||
net-pop
|
||||
net-smtp
|
||||
rails-dom-testing (~> 2.2)
|
||||
actionpack (7.1.0.rc1)
|
||||
actionview (= 7.1.0.rc1)
|
||||
activesupport (= 7.1.0.rc1)
|
||||
actionpack (7.2.0.alpha)
|
||||
actionview (= 7.2.0.alpha)
|
||||
activesupport (= 7.2.0.alpha)
|
||||
nokogiri (>= 1.8.5)
|
||||
rack (>= 2.2.4)
|
||||
rack-session (>= 1.0.1)
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.2)
|
||||
rails-html-sanitizer (~> 1.6)
|
||||
actiontext (7.1.0.rc1)
|
||||
actionpack (= 7.1.0.rc1)
|
||||
activerecord (= 7.1.0.rc1)
|
||||
activestorage (= 7.1.0.rc1)
|
||||
activesupport (= 7.1.0.rc1)
|
||||
actiontext (7.2.0.alpha)
|
||||
actionpack (= 7.2.0.alpha)
|
||||
activerecord (= 7.2.0.alpha)
|
||||
activestorage (= 7.2.0.alpha)
|
||||
activesupport (= 7.2.0.alpha)
|
||||
globalid (>= 0.6.0)
|
||||
nokogiri (>= 1.8.5)
|
||||
actionview (7.1.0.rc1)
|
||||
activesupport (= 7.1.0.rc1)
|
||||
actionview (7.2.0.alpha)
|
||||
activesupport (= 7.2.0.alpha)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.11)
|
||||
rails-dom-testing (~> 2.2)
|
||||
rails-html-sanitizer (~> 1.6)
|
||||
activejob (7.1.0.rc1)
|
||||
activesupport (= 7.1.0.rc1)
|
||||
activejob (7.2.0.alpha)
|
||||
activesupport (= 7.2.0.alpha)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (7.1.0.rc1)
|
||||
activesupport (= 7.1.0.rc1)
|
||||
activerecord (7.1.0.rc1)
|
||||
activemodel (= 7.1.0.rc1)
|
||||
activesupport (= 7.1.0.rc1)
|
||||
activemodel (7.2.0.alpha)
|
||||
activesupport (= 7.2.0.alpha)
|
||||
activerecord (7.2.0.alpha)
|
||||
activemodel (= 7.2.0.alpha)
|
||||
activesupport (= 7.2.0.alpha)
|
||||
timeout (>= 0.4.0)
|
||||
activestorage (7.1.0.rc1)
|
||||
actionpack (= 7.1.0.rc1)
|
||||
activejob (= 7.1.0.rc1)
|
||||
activerecord (= 7.1.0.rc1)
|
||||
activesupport (= 7.1.0.rc1)
|
||||
activestorage (7.2.0.alpha)
|
||||
actionpack (= 7.2.0.alpha)
|
||||
activejob (= 7.2.0.alpha)
|
||||
activerecord (= 7.2.0.alpha)
|
||||
activesupport (= 7.2.0.alpha)
|
||||
marcel (~> 1.0)
|
||||
activesupport (7.1.0.rc1)
|
||||
activesupport (7.2.0.alpha)
|
||||
base64
|
||||
bigdecimal
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
|
@ -93,23 +93,23 @@ PATH
|
|||
minitest (>= 5.1)
|
||||
mutex_m
|
||||
tzinfo (~> 2.0)
|
||||
rails (7.1.0.rc1)
|
||||
actioncable (= 7.1.0.rc1)
|
||||
actionmailbox (= 7.1.0.rc1)
|
||||
actionmailer (= 7.1.0.rc1)
|
||||
actionpack (= 7.1.0.rc1)
|
||||
actiontext (= 7.1.0.rc1)
|
||||
actionview (= 7.1.0.rc1)
|
||||
activejob (= 7.1.0.rc1)
|
||||
activemodel (= 7.1.0.rc1)
|
||||
activerecord (= 7.1.0.rc1)
|
||||
activestorage (= 7.1.0.rc1)
|
||||
activesupport (= 7.1.0.rc1)
|
||||
rails (7.2.0.alpha)
|
||||
actioncable (= 7.2.0.alpha)
|
||||
actionmailbox (= 7.2.0.alpha)
|
||||
actionmailer (= 7.2.0.alpha)
|
||||
actionpack (= 7.2.0.alpha)
|
||||
actiontext (= 7.2.0.alpha)
|
||||
actionview (= 7.2.0.alpha)
|
||||
activejob (= 7.2.0.alpha)
|
||||
activemodel (= 7.2.0.alpha)
|
||||
activerecord (= 7.2.0.alpha)
|
||||
activestorage (= 7.2.0.alpha)
|
||||
activesupport (= 7.2.0.alpha)
|
||||
bundler (>= 1.15.0)
|
||||
railties (= 7.1.0.rc1)
|
||||
railties (7.1.0.rc1)
|
||||
actionpack (= 7.1.0.rc1)
|
||||
activesupport (= 7.1.0.rc1)
|
||||
railties (= 7.2.0.alpha)
|
||||
railties (7.2.0.alpha)
|
||||
actionpack (= 7.2.0.alpha)
|
||||
activesupport (= 7.2.0.alpha)
|
||||
irb
|
||||
rackup (>= 1.0.0)
|
||||
rake (>= 12.2)
|
||||
|
@ -557,7 +557,7 @@ GEM
|
|||
websocket-extensions (0.1.5)
|
||||
xpath (3.2.0)
|
||||
nokogiri (~> 1.8)
|
||||
zeitwerk (2.6.11)
|
||||
zeitwerk (2.6.12)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
|
|
@ -1 +1 @@
|
|||
7.1.0.rc1
|
||||
7.2.0.alpha
|
||||
|
|
|
@ -1,106 +1,2 @@
|
|||
## Rails 7.1.0.rc1 (September 27, 2023) ##
|
||||
|
||||
* No changes.
|
||||
|
||||
|
||||
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
||||
|
||||
* Add a `@server` instance variable referencing the `ActionCable.server`
|
||||
singleton to `ActionCable::Channel::ConnectionStub`
|
||||
|
||||
This lets us delegate the `pubsub` and `config` method calls
|
||||
to the server. This fixes `NoMethodError` errors when testing
|
||||
channel logic that call `pubsub` (e.g. `stop_stream_for`).
|
||||
|
||||
*Julian Foo*
|
||||
|
||||
* Added `health_check_path` and `health_check_application` config to
|
||||
mount a given health check rack app on a given path.
|
||||
Useful when mounting Action Cable standalone.
|
||||
|
||||
*Joé Dupuis*
|
||||
|
||||
* Introduce the `capture_broadcasts` test helper.
|
||||
|
||||
Returns all messages broadcast in a block.
|
||||
|
||||
```ruby
|
||||
messages = capture_broadcasts("test") do
|
||||
ActionCable.server.broadcast "test", { message: "one" }
|
||||
ActionCable.server.broadcast "test", { message: "two" }
|
||||
end
|
||||
assert_equal 2, messages.length
|
||||
assert_equal({ "message" => "one" }, messages.first)
|
||||
assert_equal({ "message" => "two" }, messages.last)
|
||||
```
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Display broadcasted messages on error message when using `assert_broadcast_on`
|
||||
|
||||
*Stéphane Robino*
|
||||
|
||||
* The Action Cable client now supports subprotocols to allow passing arbitrary data
|
||||
to the server.
|
||||
|
||||
```js
|
||||
const consumer = ActionCable.createConsumer()
|
||||
|
||||
consumer.addSubProtocol('custom-protocol')
|
||||
|
||||
consumer.connect()
|
||||
```
|
||||
|
||||
See also:
|
||||
|
||||
* https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#subprotocols
|
||||
|
||||
*Guillaume Hain*
|
||||
|
||||
* Redis pub/sub adapter now automatically reconnects when Redis connection is lost.
|
||||
|
||||
*Vladimir Dementyev*
|
||||
|
||||
* The `connected()` callback can now take a `{reconnected}` parameter to differentiate
|
||||
connections from reconnections.
|
||||
|
||||
```js
|
||||
import consumer from "./consumer"
|
||||
|
||||
consumer.subscriptions.create("ExampleChannel", {
|
||||
connected({reconnected}) {
|
||||
if (reconnected) {
|
||||
...
|
||||
} else {
|
||||
...
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
*Mansa Keïta*
|
||||
|
||||
* The Redis adapter is now compatible with redis-rb 5.0
|
||||
|
||||
Compatibility with redis-rb 3.x was dropped.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* The Action Cable server is now mounted with `anchor: true`.
|
||||
|
||||
This means that routes that also start with `/cable` will no longer clash with Action Cable.
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* `ActionCable.server.remote_connections.where(...).disconnect` now sends `disconnect` message
|
||||
before closing the connection with the reconnection strategy specified (defaults to `true`).
|
||||
|
||||
*Vladimir Dementyev*
|
||||
|
||||
* Added command callbacks to `ActionCable::Connection::Base`.
|
||||
|
||||
Now you can define `before_command`, `after_command`, and `around_command` to be invoked before, after or around any command received by a client respectively.
|
||||
|
||||
*Vladimir Dementyev*
|
||||
|
||||
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/actioncable/CHANGELOG.md) for previous changes.
|
||||
Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/actioncable/CHANGELOG.md) for previous changes.
|
||||
|
|
|
@ -8,9 +8,9 @@ module ActionCable
|
|||
|
||||
module VERSION
|
||||
MAJOR = 7
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
TINY = 0
|
||||
PRE = "rc1"
|
||||
PRE = "alpha"
|
||||
|
||||
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@rails/actioncable",
|
||||
"version": "7.1.0-rc1",
|
||||
"version": "7.2.0-alpha",
|
||||
"description": "WebSocket framework for Ruby on Rails.",
|
||||
"module": "app/assets/javascripts/actioncable.esm.js",
|
||||
"main": "app/assets/javascripts/actioncable.js",
|
||||
|
|
|
@ -1,26 +1,2 @@
|
|||
## Rails 7.1.0.rc1 (September 27, 2023) ##
|
||||
|
||||
* No changes.
|
||||
|
||||
|
||||
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
||||
|
||||
* Added `bounce_now_with` to send the bounce email without going through a mailer queue.
|
||||
|
||||
*Ronan Limon Duparcmeur*
|
||||
|
||||
* Support configured primary key types in generated migrations.
|
||||
|
||||
*Nishiki Liu*
|
||||
|
||||
* Fixed ingress controllers' ability to accept emails that contain no UTF-8 encoded parts.
|
||||
|
||||
Fixes #46297.
|
||||
|
||||
*Jan Honza Sterba*
|
||||
|
||||
* Add X-Forwarded-To addresses to recipients.
|
||||
|
||||
*Andrew Stewart*
|
||||
|
||||
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/actionmailbox/CHANGELOG.md) for previous changes.
|
||||
Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/actionmailbox/CHANGELOG.md) for previous changes.
|
||||
|
|
|
@ -8,9 +8,9 @@ module ActionMailbox
|
|||
|
||||
module VERSION
|
||||
MAJOR = 7
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
TINY = 0
|
||||
PRE = "rc1"
|
||||
PRE = "alpha"
|
||||
|
||||
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
||||
end
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema[7.1].define(version: 2018_02_12_164506) do
|
||||
ActiveRecord::Schema[7.2].define(version: 2018_02_12_164506) do
|
||||
create_table "action_mailbox_inbound_emails", force: :cascade do |t|
|
||||
t.integer "status", default: 0, null: false
|
||||
t.string "message_id", null: false
|
||||
|
|
|
@ -1,133 +1,2 @@
|
|||
## Rails 7.1.0.rc1 (September 27, 2023) ##
|
||||
|
||||
* Introduce `ActionMailer::FormBuilder`
|
||||
|
||||
Use the `default_form_builder` method in mailers to set the default form builder
|
||||
for templates rendered by that mailer. Matches the behaviour in Action Controller.
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
|
||||
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
||||
|
||||
* Mailers are listed in alphabetical order on the mailer preview page now.
|
||||
|
||||
*Martin Spickermann*
|
||||
|
||||
* Deprecate passing params to `assert_enqueued_email_with` via the `:args`
|
||||
kwarg. `assert_enqueued_email_with` now supports a `:params` kwarg, so use
|
||||
that to pass params:
|
||||
|
||||
```ruby
|
||||
# BEFORE
|
||||
assert_enqueued_email_with MyMailer, :my_method, args: { my_param: "value" }
|
||||
|
||||
# AFTER
|
||||
assert_enqueued_email_with MyMailer, :my_method, params: { my_param: "value" }
|
||||
```
|
||||
|
||||
To specify named mailer args as a Hash, wrap the Hash in an array:
|
||||
|
||||
```ruby
|
||||
assert_enqueued_email_with MyMailer, :my_method, args: [{ my_arg: "value" }]
|
||||
# OR
|
||||
assert_enqueued_email_with MyMailer, :my_method, args: [my_arg: "value"]
|
||||
```
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Accept procs for args and params in `assert_enqueued_email_with`
|
||||
|
||||
```ruby
|
||||
assert_enqueued_email_with DeliveryJob, params: -> p { p[:token] =~ /\w+/ } do
|
||||
UserMailer.with(token: user.generate_token).email_verification.deliver_later
|
||||
end
|
||||
```
|
||||
|
||||
*Max Chernyak*
|
||||
|
||||
* Added `*_deliver` callbacks to `ActionMailer::Base` that wrap mail message delivery.
|
||||
|
||||
Example:
|
||||
|
||||
```ruby
|
||||
class EventsMailer < ApplicationMailer
|
||||
after_deliver do
|
||||
User.find_by(email: message.to.first).update(email_provider_id: message.message_id, emailed_at: Time.current)
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
*Ben Sheldon*
|
||||
|
||||
* Added `deliver_enqueued_emails` to `ActionMailer::TestHelper`. This method
|
||||
delivers all enqueued email jobs.
|
||||
|
||||
Example:
|
||||
|
||||
```ruby
|
||||
def test_deliver_enqueued_emails
|
||||
deliver_enqueued_emails do
|
||||
ContactMailer.welcome.deliver_later
|
||||
end
|
||||
assert_emails 1
|
||||
end
|
||||
```
|
||||
|
||||
*Andrew Novoselac*
|
||||
|
||||
* The `deliver_later_queue_name` used by the default mailer job can now be
|
||||
configured on a per-mailer basis. Previously this was only configurable
|
||||
for all mailers via `ActionMailer::Base`.
|
||||
|
||||
Example:
|
||||
|
||||
```ruby
|
||||
class EventsMailer < ApplicationMailer
|
||||
self.deliver_later_queue_name = :throttled_mailer
|
||||
end
|
||||
```
|
||||
|
||||
*Jeffrey Hardy*
|
||||
|
||||
* Email previews now include an expandable section to show all headers.
|
||||
|
||||
Headers like `Message-ID` for threading or email service provider specific
|
||||
features like analytics tags or account metadata can now be viewed directly
|
||||
in the mailer preview.
|
||||
|
||||
*Matt Swanson*
|
||||
|
||||
* Default `ActionMailer::Parameterized#params` to an empty `Hash`
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Introduce the `capture_emails` test helper.
|
||||
|
||||
Returns all emails that are sent in a block.
|
||||
|
||||
```ruby
|
||||
def test_emails
|
||||
emails = capture_emails do
|
||||
ContactMailer.welcome.deliver_now
|
||||
ContactMailer.welcome.deliver_later
|
||||
end
|
||||
assert_email "Hi there", emails.first.subject
|
||||
end
|
||||
```
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Added ability to download `.eml` file for the email preview.
|
||||
|
||||
*Igor Kasyanchuk*
|
||||
|
||||
* Support multiple preview paths for mailers.
|
||||
|
||||
Option `config.action_mailer.preview_path` is deprecated in favor of
|
||||
`config.action_mailer.preview_paths`. Appending paths to this configuration option
|
||||
will cause those paths to be used in the search for mailer previews.
|
||||
|
||||
*fatkodima*
|
||||
|
||||
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/actionmailer/CHANGELOG.md) for previous changes.
|
||||
Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/actionmailer/CHANGELOG.md) for previous changes.
|
||||
|
|
|
@ -8,9 +8,9 @@ module ActionMailer
|
|||
|
||||
module VERSION
|
||||
MAJOR = 7
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
TINY = 0
|
||||
PRE = "rc1"
|
||||
PRE = "alpha"
|
||||
|
||||
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
||||
end
|
||||
|
|
|
@ -1,532 +1,2 @@
|
|||
## Rails 7.1.0.rc1 (September 27, 2023) ##
|
||||
|
||||
* Add support for `#deep_merge` and `#deep_merge!` to
|
||||
`ActionController::Parameters`.
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
|
||||
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
||||
|
||||
* `AbstractController::Translation.raise_on_missing_translations` removed
|
||||
|
||||
This was a private API, and has been removed in favour of a more broadly applicable
|
||||
`config.i18n.raise_on_missing_translations`. See the upgrading guide for more information.
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Add `ActionController::Parameters#extract_value` method to allow extracting serialized values from params
|
||||
|
||||
```ruby
|
||||
params = ActionController::Parameters.new(id: "1_123", tags: "ruby,rails")
|
||||
params.extract_value(:id) # => ["1", "123"]
|
||||
params.extract_value(:tags, delimiter: ",") # => ["ruby", "rails"]
|
||||
```
|
||||
|
||||
*Nikita Vasilevsky*
|
||||
|
||||
* Parse JSON `response.parsed_body` with `ActiveSupport::HashWithIndifferentAccess`
|
||||
|
||||
Integrate with Minitest's new `assert_pattern` by parsing the JSON contents
|
||||
of `response.parsed_body` with `ActiveSupport::HashWithIndifferentAccess`, so
|
||||
that it's pattern-matching compatible.
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Add support for Playwright as a driver for system tests.
|
||||
|
||||
*Yuki Nishijima*
|
||||
|
||||
* Fix `HostAuthorization` potentially displaying the value of the
|
||||
X_FORWARDED_HOST header when the HTTP_HOST header is being blocked.
|
||||
|
||||
*Hartley McGuire*, *Daniel Schlosser*
|
||||
|
||||
* Rename `fixture_file_upload` method to `file_fixture_upload`
|
||||
|
||||
Declare an alias to preserve the backwards compatibility of `fixture_file_upload`
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* `ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelper` saves the screenshot path in test metadata on failure.
|
||||
|
||||
*Matija Čupić*
|
||||
|
||||
* `config.dom_testing_default_html_version` controls the HTML parser used by
|
||||
`ActionDispatch::Assertions#html_document`.
|
||||
|
||||
The Rails 7.1 default configuration opts into the HTML5 parser when it is supported, to better
|
||||
represent what the DOM would be in a browser user agent. Previously this test helper always used
|
||||
Nokogiri's HTML4 parser.
|
||||
|
||||
*Mike Dalessio*
|
||||
|
||||
* The `with_routing` helper can now be called at the class level. When called at the class level, the routes will
|
||||
be setup before each test, and reset after every test. For example:
|
||||
|
||||
```ruby
|
||||
class RoutingTest < ActionController::TestCase
|
||||
with_routing do |routes|
|
||||
routes.draw do
|
||||
resources :articles
|
||||
resources :authors
|
||||
end
|
||||
end
|
||||
|
||||
def test_articles_route
|
||||
assert_routing("/articles", controller: "articles", action: "index")
|
||||
end
|
||||
|
||||
def test_authors_route
|
||||
assert_routing("/authors", controller: "authors", action: "index")
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
*Andrew Novoselac*
|
||||
|
||||
* The `Mime::Type` now supports handling types with parameters and correctly handles quotes.
|
||||
When parsing the accept header, the parameters before the q-parameter are kept and if a matching mime-type exists it is used.
|
||||
To keep the current functionality, a fallback is created to look for the media-type without the parameters.
|
||||
|
||||
This change allows for custom MIME-types that are more complex like `application/vnd.api+json; profile="https://jsonapi.org/profiles/ethanresnick/cursor-pagination/" ext="https://jsonapi.org/ext/atomic"` for the [JSON API](https://jsonapi.org/).
|
||||
|
||||
*Nicolas Erni*
|
||||
|
||||
* The url_for helpers now support a new option called `path_params`.
|
||||
This is very useful in situations where you only want to add a required param that is part of the route's URL but for other route not append an extraneous query param.
|
||||
|
||||
Given the following router...
|
||||
|
||||
```ruby
|
||||
Rails.application.routes.draw do
|
||||
scope ":account_id" do
|
||||
get "dashboard" => "pages#dashboard", as: :dashboard
|
||||
get "search/:term" => "search#search", as: :search
|
||||
end
|
||||
delete "signout" => "sessions#destroy", as: :signout
|
||||
end
|
||||
```
|
||||
|
||||
And given the following `ApplicationController`
|
||||
|
||||
```ruby
|
||||
class ApplicationController < ActionController::Base
|
||||
def default_url_options
|
||||
{ path_params: { account_id: "foo" } }
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
The standard url_for helper and friends will now behave as follows:
|
||||
|
||||
```ruby
|
||||
dashboard_path # => /foo/dashboard
|
||||
dashboard_path(account_id: "bar") # => /bar/dashboard
|
||||
|
||||
signout_path # => /signout
|
||||
signout_path(account_id: "bar") # => /signout?account_id=bar
|
||||
signout_path(account_id: "bar", path_params: { account_id: "baz" }) # => /signout?account_id=bar
|
||||
search_path("quin") # => /foo/search/quin
|
||||
```
|
||||
|
||||
*Jason Meller, Jeremy Beker*
|
||||
|
||||
* Change `action_dispatch.show_exceptions` to one of `:all`, `:rescuable`, or
|
||||
`:none`. `:all` and `:none` behave the same as the previous `true` and
|
||||
`false` respectively. The new `:rescuable` option will only show exceptions
|
||||
that can be rescued (e.g. `ActiveRecord::RecordNotFound`). `:rescuable` is
|
||||
now the default for the test environment.
|
||||
|
||||
*Jon Dufresne*
|
||||
|
||||
* `config.action_dispatch.cookies_serializer` now accepts `:message_pack` and
|
||||
`:message_pack_allow_marshal` as serializers. These serializers require the
|
||||
[`msgpack` gem](https://rubygems.org/gems/msgpack) (>= 1.7.0).
|
||||
|
||||
The Message Pack format can provide improved performance and smaller payload
|
||||
sizes. It also supports roundtripping some Ruby types that are not supported
|
||||
by JSON. For example:
|
||||
|
||||
```ruby
|
||||
cookies.encrypted[:foo] = [{ a: 1 }, { b: 2 }.with_indifferent_access, 1.to_d, Time.at(0, 123)]
|
||||
|
||||
# BEFORE with config.action_dispatch.cookies_serializer = :json
|
||||
cookies.encrypted[:foo]
|
||||
# => [{"a"=>1}, {"b"=>2}, "1.0", "1969-12-31T18:00:00.000-06:00"]
|
||||
cookies.encrypted[:foo].map(&:class)
|
||||
# => [Hash, Hash, String, String]
|
||||
|
||||
# AFTER with config.action_dispatch.cookies_serializer = :message_pack
|
||||
cookies.encrypted[:foo]
|
||||
# => [{:a=>1}, {"b"=>2}, 0.1e1, 1969-12-31 18:00:00.000123 -0600]
|
||||
cookies.encrypted[:foo].map(&:class)
|
||||
# => [Hash, ActiveSupport::HashWithIndifferentAccess, BigDecimal, Time]
|
||||
```
|
||||
|
||||
The `:message_pack` serializer can fall back to deserializing with
|
||||
`ActiveSupport::JSON` when necessary, and the `:message_pack_allow_marshal`
|
||||
serializer can fall back to deserializing with `Marshal` as well as
|
||||
`ActiveSupport::JSON`. Additionally, the `:marshal`, `:json`, and
|
||||
`:json_allow_marshal` (AKA `:hybrid`) serializers can now fall back to
|
||||
deserializing with `ActiveSupport::MessagePack` when necessary. These
|
||||
behaviors ensure old cookies can still be read so that migration is easier.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Remove leading dot from domains on cookies set with `domain: :all`, to meet RFC6265 requirements
|
||||
|
||||
*Gareth Adams*
|
||||
|
||||
* Include source location in routes extended view.
|
||||
|
||||
```bash
|
||||
$ bin/rails routes --expanded
|
||||
|
||||
...
|
||||
--[ Route 14 ]----------
|
||||
Prefix | new_gist
|
||||
Verb | GET
|
||||
URI | /gist(.:format)
|
||||
Controller#Action | gists/gists#new
|
||||
Source Location | config/routes/gist.rb:3
|
||||
```
|
||||
|
||||
*Luan Vieira, John Hawthorn and Daniel Colson*
|
||||
|
||||
* Add `without` as an alias of `except` on `ActiveController::Parameters`.
|
||||
|
||||
*Hidde-Jan Jongsma*
|
||||
|
||||
* Expand search field on `rails/info/routes` to also search **route name**, **http verb** and **controller#action**.
|
||||
|
||||
*Jason Kotchoff*
|
||||
|
||||
* Remove deprecated `poltergeist` and `webkit` (capybara-webkit) driver registration for system testing.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated ability to assign a single value to `config.action_dispatch.trusted_proxies`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Deprecate `config.action_dispatch.return_only_request_media_type_on_content_type`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated behavior on `Request#content_type`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Change `ActionController::Instrumentation` to pass `filtered_path` instead of `fullpath` in the event payload to filter sensitive query params
|
||||
|
||||
```ruby
|
||||
get "/posts?password=test"
|
||||
request.fullpath # => "/posts?password=test"
|
||||
request.filtered_path # => "/posts?password=[FILTERED]"
|
||||
```
|
||||
|
||||
*Ritikesh G*
|
||||
|
||||
* Deprecate `AbstractController::Helpers::MissingHelperError`
|
||||
|
||||
*Hartley McGuire*
|
||||
|
||||
* Change `ActionDispatch::Testing::TestResponse#parsed_body` to parse HTML as
|
||||
a Nokogiri document
|
||||
|
||||
```ruby
|
||||
get "/posts"
|
||||
response.content_type # => "text/html; charset=utf-8"
|
||||
response.parsed_body.class # => Nokogiri::HTML5::Document
|
||||
response.parsed_body.to_html # => "<!DOCTYPE html>\n<html>\n..."
|
||||
```
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Deprecate `ActionDispatch::IllegalStateError`.
|
||||
|
||||
*Samuel Williams*
|
||||
|
||||
* Add HTTP::Request#route_uri_pattern that returns URI pattern of matched route.
|
||||
|
||||
*Joel Hawksley*, *Kate Higa*
|
||||
|
||||
* Add `ActionDispatch::AssumeSSL` middleware that can be turned on via `config.assume_ssl`.
|
||||
It makes the application believe that all requests are arriving over SSL. This is useful
|
||||
when proxying through a load balancer that terminates SSL, the forwarded request will appear
|
||||
as though its HTTP instead of HTTPS to the application. This makes redirects and cookie
|
||||
security target HTTP instead of HTTPS. This middleware makes the server assume that the
|
||||
proxy already terminated SSL, and that the request really is HTTPS.
|
||||
|
||||
*DHH*
|
||||
|
||||
* Only use HostAuthorization middleware if `config.hosts` is not empty
|
||||
|
||||
*Hartley McGuire*
|
||||
|
||||
* Allow raising an error when a callback's only/unless symbols aren't existing methods.
|
||||
|
||||
When `before_action :callback, only: :action_name` is declared on a controller that doesn't respond to `action_name`, raise an exception at request time. This is a safety measure to ensure that typos or forgetfulness don't prevent a crucial callback from being run when it should.
|
||||
|
||||
For new applications, raising an error for undefined actions is turned on by default. If you do not want to opt-in to this behavior set `config.action_pack.raise_on_missing_callback_actions` to `false` in your application configuration. See #43487 for more details.
|
||||
|
||||
*Jess Bees*
|
||||
|
||||
* Allow cookie options[:domain] to accept a proc to set the cookie domain on a more flexible per-request basis
|
||||
|
||||
*RobL*
|
||||
|
||||
* When a host is not specified for an `ActionController::Renderer`'s env,
|
||||
the host and related options will now be derived from the routes'
|
||||
`default_url_options` and `ActionDispatch::Http::URL.secure_protocol`.
|
||||
|
||||
This means that for an application with a configuration like:
|
||||
|
||||
```ruby
|
||||
Rails.application.default_url_options = { host: "rubyonrails.org" }
|
||||
Rails.application.config.force_ssl = true
|
||||
```
|
||||
|
||||
rendering a URL like:
|
||||
|
||||
```ruby
|
||||
ApplicationController.renderer.render inline: "<%= blog_url %>"
|
||||
```
|
||||
|
||||
will now return `"https://rubyonrails.org/blog"` instead of
|
||||
`"http://example.org/blog"`.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Add details of cookie name and size to `CookieOverflow` exception.
|
||||
|
||||
*Andy Waite*
|
||||
|
||||
* Don't double log the `controller`, `action`, or `namespaced_controller` when using `ActiveRecord::QueryLog`
|
||||
|
||||
Previously if you set `config.active_record.query_log_tags` to an array that included
|
||||
`:controller`, `:namespaced_controller`, or `:action`, that item would get logged twice.
|
||||
This bug has been fixed.
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Add the following permissions policy directives: `hid`, `idle-detection`, `screen-wake-lock`,
|
||||
`serial`, `sync-xhr`, `web-share`.
|
||||
|
||||
*Guillaume Cabanel*
|
||||
|
||||
* The `speaker`, `vibrate`, and `vr` permissions policy directives are now
|
||||
deprecated.
|
||||
|
||||
There is no browser support for these directives, and no plan for browser
|
||||
support in the future. You can just remove these directives from your
|
||||
application.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Added the `:status` option to `assert_redirected_to` to specify the precise
|
||||
HTTP status of the redirect. Defaults to `:redirect` for backwards
|
||||
compatibility.
|
||||
|
||||
*Jon Dufresne*
|
||||
|
||||
* Rescue `JSON::ParserError` in Cookies JSON deserializer to discards marshal dumps:
|
||||
|
||||
Without this change, if `action_dispatch.cookies_serializer` is set to `:json` and
|
||||
the app tries to read a `:marshal` serialized cookie, it would error out which wouldn't
|
||||
clear the cookie and force app users to manually clear it in their browser.
|
||||
|
||||
(See #45127 for original bug discussion)
|
||||
|
||||
*Nathan Bardoux*
|
||||
|
||||
* Add `HTTP_REFERER` when following redirects on integration tests
|
||||
|
||||
This makes `follow_redirect!` a closer simulation of what happens in a real browser
|
||||
|
||||
*Felipe Sateler*
|
||||
|
||||
* Added `exclude?` method to `ActionController::Parameters`.
|
||||
|
||||
*Ian Neubert*
|
||||
|
||||
* Rescue `EOFError` exception from `rack` on a multipart request.
|
||||
|
||||
*Nikita Vasilevsky*
|
||||
|
||||
* Log redirects from routes the same way as redirects from controllers.
|
||||
|
||||
*Dennis Paagman*
|
||||
|
||||
* Prevent `ActionDispatch::ServerTiming` from overwriting existing values in `Server-Timing`.
|
||||
Previously, if another middleware down the chain set `Server-Timing` header,
|
||||
it would overwritten by `ActionDispatch::ServerTiming`.
|
||||
|
||||
*Jakub Malinowski*
|
||||
|
||||
* Allow opting out of the `SameSite` cookie attribute when setting a cookie.
|
||||
|
||||
You can opt out of `SameSite` by passing `same_site: nil`.
|
||||
|
||||
`cookies[:foo] = { value: "bar", same_site: nil }`
|
||||
|
||||
Previously, this incorrectly set the `SameSite` attribute to the value of the `cookies_same_site_protection` setting.
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Allow using `helper_method`s in `content_security_policy` and `permissions_policy`
|
||||
|
||||
Previously you could access basic helpers (defined in helper modules), but not
|
||||
helper methods defined using `helper_method`. Now you can use either.
|
||||
|
||||
```ruby
|
||||
content_security_policy do |p|
|
||||
p.default_src "https://example.com"
|
||||
p.script_src "https://example.com" if helpers.script_csp?
|
||||
end
|
||||
```
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Reimplement `ActionController::Parameters#has_value?` and `#value?` to avoid parameters and hashes comparison.
|
||||
|
||||
Deprecated equality between parameters and hashes is going to be removed in Rails 7.2.
|
||||
The new implementation takes care of conversions.
|
||||
|
||||
*Seva Stefkin*
|
||||
|
||||
* Allow only String and Symbol keys in `ActionController::Parameters`.
|
||||
Raise `ActionController::InvalidParameterKey` when initializing Parameters
|
||||
with keys that aren't strings or symbols.
|
||||
|
||||
*Seva Stefkin*
|
||||
|
||||
* Add the ability to use custom logic for storing and retrieving CSRF tokens.
|
||||
|
||||
By default, the token will be stored in the session. Custom classes can be
|
||||
defined to specify arbitrary behavior, but the ability to store them in
|
||||
encrypted cookies is built in.
|
||||
|
||||
*Andrew Kowpak*
|
||||
|
||||
* Make ActionController::Parameters#values cast nested hashes into parameters.
|
||||
|
||||
*Gannon McGibbon*
|
||||
|
||||
* Introduce `html:` and `screenshot:` kwargs for system test screenshot helper
|
||||
|
||||
Use these as an alternative to the already-available environment variables.
|
||||
|
||||
For example, this will display a screenshot in iTerm, save the HTML, and output
|
||||
its path.
|
||||
|
||||
```ruby
|
||||
take_screenshot(html: true, screenshot: "inline")
|
||||
```
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Allow `ActionController::Parameters#to_h` to receive a block.
|
||||
|
||||
*Bob Farrell*
|
||||
|
||||
* Allow relative redirects when `raise_on_open_redirects` is enabled
|
||||
|
||||
*Tom Hughes*
|
||||
|
||||
* Allow Content Security Policy DSL to generate for API responses.
|
||||
|
||||
*Tim Wade*
|
||||
|
||||
* Fix `authenticate_with_http_basic` to allow for missing password.
|
||||
|
||||
Before Rails 7.0 it was possible to handle basic authentication with only a username.
|
||||
|
||||
```ruby
|
||||
authenticate_with_http_basic do |token, _|
|
||||
ApiClient.authenticate(token)
|
||||
end
|
||||
```
|
||||
|
||||
This ability is restored.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Fix `content_security_policy` returning invalid directives.
|
||||
|
||||
Directives such as `self`, `unsafe-eval` and few others were not
|
||||
single quoted when the directive was the result of calling a lambda
|
||||
returning an array.
|
||||
|
||||
```ruby
|
||||
content_security_policy do |policy|
|
||||
policy.frame_ancestors lambda { [:self, "https://example.com"] }
|
||||
end
|
||||
```
|
||||
|
||||
With this fix the policy generated from above will now be valid.
|
||||
|
||||
*Edouard Chin*
|
||||
|
||||
* Fix `skip_forgery_protection` to run without raising an error if forgery
|
||||
protection has not been enabled / `verify_authenticity_token` is not a
|
||||
defined callback.
|
||||
|
||||
This fix prevents the Rails 7.0 Welcome Page (`/`) from raising an
|
||||
`ArgumentError` if `default_protect_from_forgery` is false.
|
||||
|
||||
*Brad Trick*
|
||||
|
||||
* Make `redirect_to` return an empty response body.
|
||||
|
||||
Application controllers that wish to add a response body after calling
|
||||
`redirect_to` can continue to do so.
|
||||
|
||||
*Jon Dufresne*
|
||||
|
||||
* Use non-capturing group for subdomain matching in `ActionDispatch::HostAuthorization`
|
||||
|
||||
Since we do nothing with the captured subdomain group, we can use a non-capturing group instead.
|
||||
|
||||
*Sam Bostock*
|
||||
|
||||
* Fix `ActionController::Live` to copy the IsolatedExecutionState in the ephemeral thread.
|
||||
|
||||
Since its inception `ActionController::Live` has been copying thread local variables
|
||||
to keep things such as `CurrentAttributes` set from middlewares working in the controller action.
|
||||
|
||||
With the introduction of `IsolatedExecutionState` in 7.0, some of that global state was lost in
|
||||
`ActionController::Live` controllers.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Fix setting `trailing_slash: true` in route definition.
|
||||
|
||||
```ruby
|
||||
get '/test' => "test#index", as: :test, trailing_slash: true
|
||||
|
||||
test_path() # => "/test/"
|
||||
```
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Make `Session#merge!` stringify keys.
|
||||
|
||||
Previously `Session#update` would, but `merge!` wouldn't.
|
||||
|
||||
*Drew Bragg*
|
||||
|
||||
* Add `:unsafe_hashes` mapping for `content_security_policy`
|
||||
|
||||
```ruby
|
||||
# Before
|
||||
policy.script_src :strict_dynamic, "'unsafe-hashes'", "'sha256-rRMdkshZyJlCmDX27XnL7g3zXaxv7ei6Sg+yt4R3svU='"
|
||||
|
||||
# After
|
||||
policy.script_src :strict_dynamic, :unsafe_hashes, "'sha256-rRMdkshZyJlCmDX27XnL7g3zXaxv7ei6Sg+yt4R3svU='"
|
||||
```
|
||||
|
||||
*Igor Morozov*
|
||||
|
||||
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/actionpack/CHANGELOG.md) for previous changes.
|
||||
Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/actionpack/CHANGELOG.md) for previous changes.
|
||||
|
|
|
@ -8,9 +8,9 @@ module ActionPack
|
|||
|
||||
module VERSION
|
||||
MAJOR = 7
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
TINY = 0
|
||||
PRE = "rc1"
|
||||
PRE = "alpha"
|
||||
|
||||
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
||||
end
|
||||
|
|
|
@ -1,63 +1,2 @@
|
|||
## Rails 7.1.0.rc1 (September 27, 2023) ##
|
||||
|
||||
* No changes.
|
||||
|
||||
|
||||
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
||||
|
||||
* Use `Rails::HTML5::SafeListSanitizer` by default in the Rails 7.1 configuration if it is
|
||||
supported.
|
||||
|
||||
Action Text's sanitizer can be configured by setting
|
||||
`config.action_text.sanitizer_vendor`. Supported values are `Rails::HTML4::Sanitizer` or
|
||||
`Rails::HTML5::Sanitizer`.
|
||||
|
||||
The Rails 7.1 configuration will set this to `Rails::HTML5::Sanitizer` when it is supported, and
|
||||
fall back to `Rails::HTML4::Sanitizer`. Previous configurations default to
|
||||
`Rails::HTML4::Sanitizer`.
|
||||
|
||||
As a result of this change, the defaults for `ActionText::ContentHelper.allowed_tags` and
|
||||
`.allowed_attributes` are applied at runtime, so the value of these attributes is now 'nil'
|
||||
unless set by the application. You may call `sanitizer_allowed_tags` or
|
||||
`sanitizer_allowed_attributes` to inspect the tags and attributes being allowed by the
|
||||
sanitizer.
|
||||
|
||||
*Mike Dalessio*
|
||||
|
||||
* Attachables now can override default attachment missing template.
|
||||
|
||||
When rendering Action Text attachments where the underlying attachable model has
|
||||
been removed, a fallback template is used. You now can override this template on
|
||||
a per-model basis. For example, you could render a placeholder image for a file
|
||||
attachment or the text "Deleted User" for a User attachment.
|
||||
|
||||
*Matt Swanson*, *Joel Drapper*
|
||||
|
||||
* Update bundled Trix version from `1.3.1` to `2.0.4`.
|
||||
|
||||
*Sarah Ridge*, *Sean Doyle*
|
||||
|
||||
* Apply `field_error_proc` to `rich_text_area` form fields.
|
||||
|
||||
*Kaíque Kandy Koga*
|
||||
|
||||
* Action Text attachment URLs rendered in a background job (a la Turbo
|
||||
Streams) now use `Rails.application.default_url_options` and
|
||||
`Rails.application.config.force_ssl` instead of `http://example.org`.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Support `strict_loading:` option for `has_rich_text` declaration
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Update ContentAttachment so that it can encapsulate arbitrary HTML content in a document.
|
||||
|
||||
*Jamis Buck*
|
||||
|
||||
* Fix an issue that caused the content layout to render multiple times when a
|
||||
rich_text field was updated.
|
||||
|
||||
*Jacob Herrington*
|
||||
|
||||
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/actiontext/CHANGELOG.md) for previous changes.
|
||||
Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/actiontext/CHANGELOG.md) for previous changes.
|
||||
|
|
|
@ -8,9 +8,9 @@ module ActionText
|
|||
|
||||
module VERSION
|
||||
MAJOR = 7
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
TINY = 0
|
||||
PRE = "rc1"
|
||||
PRE = "alpha"
|
||||
|
||||
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@rails/actiontext",
|
||||
"version": "7.1.0-rc1",
|
||||
"version": "7.2.0-alpha",
|
||||
"description": "Edit and display rich text in Rails applications",
|
||||
"main": "app/assets/javascripts/actiontext.js",
|
||||
"type": "module",
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema[7.1].define(version: 2019_03_17_200724) do
|
||||
ActiveRecord::Schema[7.2].define(version: 2019_03_17_200724) do
|
||||
create_table "action_text_rich_texts", force: :cascade do |t|
|
||||
t.string "name", null: false
|
||||
t.text "body"
|
||||
|
|
|
@ -1,392 +1,2 @@
|
|||
## Rails 7.1.0.rc1 (September 27, 2023) ##
|
||||
|
||||
* Introduce `ActionView::TestCase.register_parser`
|
||||
|
||||
```ruby
|
||||
register_parser :rss, -> rendered { RSS::Parser.parse(rendered) }
|
||||
|
||||
test "renders RSS" do
|
||||
article = Article.create!(title: "Hello, world")
|
||||
|
||||
render formats: :rss, partial: article
|
||||
|
||||
assert_equal "Hello, world", rendered.rss.items.last.title
|
||||
end
|
||||
```
|
||||
|
||||
By default, register parsers for `:html` and `:json`.
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
|
||||
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
||||
|
||||
* Fix `simple_format` with blank `wrapper_tag` option returns plain html tag
|
||||
|
||||
By default `simple_format` method returns the text wrapped with `<p>`. But if we explicitly specify
|
||||
the `wrapper_tag: nil` in the options, it returns the text wrapped with `<></>` tag.
|
||||
|
||||
Before:
|
||||
|
||||
```ruby
|
||||
simple_format("Hello World", {}, { wrapper_tag: nil })
|
||||
# <>Hello World</>
|
||||
```
|
||||
|
||||
After:
|
||||
|
||||
```ruby
|
||||
simple_format("Hello World", {}, { wrapper_tag: nil })
|
||||
# <p>Hello World</p>
|
||||
```
|
||||
|
||||
*Akhil G Krishnan*, *Junichi Ito*
|
||||
|
||||
* Don't double-encode nested `field_id` and `field_name` index values
|
||||
|
||||
Pass `index: @options` as a default keyword argument to `field_id` and
|
||||
`field_name` view helper methods.
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Allow opting in/out of `Link preload` headers when calling `stylesheet_link_tag` or `javascript_include_tag`
|
||||
|
||||
```ruby
|
||||
# will exclude header, even if setting is enabled:
|
||||
javascript_include_tag("http://example.com/all.js", preload_links_header: false)
|
||||
|
||||
# will include header, even if setting is disabled:
|
||||
stylesheet_link_tag("http://example.com/all.js", preload_links_header: true)
|
||||
```
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Stop generating `Link preload` headers once it has reached 1KB.
|
||||
|
||||
Some proxies have trouble handling large headers, but more importantly preload links
|
||||
have diminishing returns so it's preferable not to go overboard with them.
|
||||
|
||||
If tighter control is needed, it's recommended to disable automatic generation of preloads
|
||||
and to generate them manually from the controller or from a middleware.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* `simple_format` helper now handles a `:sanitize_options` - any extra options you want appending to the sanitize.
|
||||
|
||||
Before:
|
||||
```ruby
|
||||
simple_format("<a target=\"_blank\" href=\"http://example.com\">Continue</a>")
|
||||
# => "<p><a href=\"http://example.com\">Continue</a></p>"
|
||||
```
|
||||
|
||||
After:
|
||||
```ruby
|
||||
simple_format("<a target=\"_blank\" href=\"http://example.com\">Continue</a>", {}, { sanitize_options: { attributes: %w[target href] } })
|
||||
# => "<p><a target=\"_blank\" href=\"http://example.com\">Continue</a></p>"
|
||||
```
|
||||
|
||||
*Andrei Andriichuk*
|
||||
|
||||
* Add support for HTML5 standards-compliant sanitizers, and default to `Rails::HTML5::Sanitizer`
|
||||
in the Rails 7.1 configuration if it is supported.
|
||||
|
||||
Action View's HTML sanitizers can be configured by setting
|
||||
`config.action_view.sanitizer_vendor`. Supported values are `Rails::HTML4::Sanitizer` or
|
||||
`Rails::HTML5::Sanitizer`.
|
||||
|
||||
The Rails 7.1 configuration will set this to `Rails::HTML5::Sanitizer` when it is supported, and
|
||||
fall back to `Rails::HTML4::Sanitizer`. Previous configurations default to
|
||||
`Rails::HTML4::Sanitizer`.
|
||||
|
||||
*Mike Dalessio*
|
||||
|
||||
* `config.dom_testing_default_html_version` controls the HTML parser used by
|
||||
`ActionView::TestCase#document_root_element`, which creates the DOM used by the assertions in
|
||||
Rails::Dom::Testing.
|
||||
|
||||
The Rails 7.1 default configuration opts into the HTML5 parser when it is supported, to better
|
||||
represent what the DOM would be in a browser user agent. Previously this test helper always used
|
||||
Nokogiri's HTML4 parser.
|
||||
|
||||
*Mike Dalessio*
|
||||
|
||||
* Add support for the HTML picture tag. It supports passing a String, an Array or a Block.
|
||||
Supports passing properties directly to the img tag via the `:image` key.
|
||||
Since the picture tag requires an img tag, the last element you provide will be used for the img tag.
|
||||
For complete control over the picture tag, a block can be passed, which will populate the contents of the tag accordingly.
|
||||
|
||||
Can be used like this for a single source:
|
||||
```erb
|
||||
<%= picture_tag("picture.webp") %>
|
||||
```
|
||||
which will generate the following:
|
||||
```html
|
||||
<picture>
|
||||
<img src="/images/picture.webp" />
|
||||
</picture>
|
||||
```
|
||||
|
||||
For multiple sources:
|
||||
```erb
|
||||
<%= picture_tag("picture.webp", "picture.png", :class => "mt-2", :image => { alt: "Image", class: "responsive-img" }) %>
|
||||
```
|
||||
will generate:
|
||||
```html
|
||||
<picture class="mt-2">
|
||||
<source srcset="/images/picture.webp" />
|
||||
<source srcset="/images/picture.png" />
|
||||
<img alt="Image" class="responsive-img" src="/images/picture.png" />
|
||||
</picture>
|
||||
```
|
||||
|
||||
Full control via a block:
|
||||
```erb
|
||||
<%= picture_tag(:class => "my-class") do %>
|
||||
<%= tag(:source, :srcset => image_path("picture.webp")) %>
|
||||
<%= tag(:source, :srcset => image_path("picture.png")) %>
|
||||
<%= image_tag("picture.png", :alt => "Image") %>
|
||||
<% end %>
|
||||
```
|
||||
will generate:
|
||||
```html
|
||||
<picture class="my-class">
|
||||
<source srcset="/images/picture.webp" />
|
||||
<source srcset="/images/picture.png" />
|
||||
<img alt="Image" src="/images/picture.png" />
|
||||
</picture>
|
||||
```
|
||||
|
||||
*Juan Pablo Balarini*
|
||||
|
||||
* Remove deprecated support to passing instance variables as locals to partials.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated constant `ActionView::Path`.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Guard `token_list` calls from escaping HTML too often
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* `select` can now be called with a single hash containing options and some HTML options
|
||||
|
||||
Previously this would not work as expected:
|
||||
|
||||
```erb
|
||||
<%= select :post, :author, authors, required: true %>
|
||||
```
|
||||
|
||||
Instead you needed to do this:
|
||||
|
||||
```erb
|
||||
<%= select :post, :author, authors, {}, required: true %>
|
||||
```
|
||||
|
||||
Now, either form is accepted, for the following HTML attributes: `required`, `multiple`, `size`.
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Datetime form helpers (`time_field`, `date_field`, `datetime_field`, `week_field`, `month_field`) now accept an instance of Time/Date/DateTime as `:value` option.
|
||||
|
||||
Before:
|
||||
```erb
|
||||
<%= form.datetime_field :written_at, value: Time.current.strftime("%Y-%m-%dT%T") %>
|
||||
```
|
||||
|
||||
After:
|
||||
```erb
|
||||
<%= form.datetime_field :written_at, value: Time.current %>
|
||||
```
|
||||
|
||||
*Andrey Samsonov*
|
||||
|
||||
* Choices of `select` can optionally contain html attributes as the last element
|
||||
of the child arrays when using grouped/nested collections
|
||||
|
||||
```erb
|
||||
<%= form.select :foo, [["North America", [["United States","US"],["Canada","CA"]], { disabled: "disabled" }]] %>
|
||||
# => <select><optgroup label="North America" disabled="disabled"><option value="US">United States</option><option value="CA">Canada</option></optgroup></select>
|
||||
```
|
||||
|
||||
*Chris Gunther*
|
||||
|
||||
* `check_box_tag` and `radio_button_tag` now accept `checked` as a keyword argument
|
||||
|
||||
This is to make the API more consistent with the `FormHelper` variants. You can now
|
||||
provide `checked` as a positional or keyword argument:
|
||||
|
||||
```erb
|
||||
= check_box_tag "admin", "1", false
|
||||
= check_box_tag "admin", "1", checked: false
|
||||
|
||||
= radio_button_tag 'favorite_color', 'maroon', false
|
||||
= radio_button_tag 'favorite_color', 'maroon', checked: false
|
||||
```
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Allow passing a class to `dom_id`.
|
||||
You no longer need to call `new` when passing a class to `dom_id`.
|
||||
This makes `dom_id` behave like `dom_class` in this regard.
|
||||
Apart from saving a few keystrokes, it prevents Ruby from needing
|
||||
to instantiate a whole new object just to generate a string.
|
||||
|
||||
Before:
|
||||
```ruby
|
||||
dom_id(Post) # => NoMethodError: undefined method `to_key' for Post:Class
|
||||
```
|
||||
|
||||
After:
|
||||
```ruby
|
||||
dom_id(Post) # => "new_post"
|
||||
```
|
||||
|
||||
*Goulven Champenois*
|
||||
|
||||
* Report `:locals` as part of the data returned by ActionView render instrumentation.
|
||||
|
||||
Before:
|
||||
```ruby
|
||||
{
|
||||
identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb",
|
||||
layout: "layouts/application"
|
||||
}
|
||||
```
|
||||
|
||||
After:
|
||||
```ruby
|
||||
{
|
||||
identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb",
|
||||
layout: "layouts/application",
|
||||
locals: {foo: "bar"}
|
||||
}
|
||||
```
|
||||
|
||||
*Aaron Gough*
|
||||
|
||||
* Strip `break_sequence` at the end of `word_wrap`.
|
||||
|
||||
This fixes a bug where `word_wrap` didn't properly strip off break sequences that had printable characters.
|
||||
|
||||
For example, compare the outputs of this template:
|
||||
|
||||
```erb
|
||||
# <%= word_wrap("11 22\n33 44", line_width: 2, break_sequence: "\n# ") %>
|
||||
```
|
||||
|
||||
Before:
|
||||
|
||||
```
|
||||
# 11
|
||||
# 22
|
||||
#
|
||||
# 33
|
||||
# 44
|
||||
#
|
||||
```
|
||||
|
||||
After:
|
||||
|
||||
```
|
||||
# 11
|
||||
# 22
|
||||
# 33
|
||||
# 44
|
||||
```
|
||||
|
||||
*Max Chernyak*
|
||||
|
||||
* Allow templates to set strict `locals`.
|
||||
|
||||
By default, templates will accept any `locals` as keyword arguments. To define what `locals` a template accepts, add a `locals` magic comment:
|
||||
|
||||
```erb
|
||||
<%# locals: (message:) -%>
|
||||
<%= message %>
|
||||
```
|
||||
|
||||
Default values can also be provided:
|
||||
|
||||
```erb
|
||||
<%# locals: (message: "Hello, world!") -%>
|
||||
<%= message %>
|
||||
```
|
||||
|
||||
Or `locals` can be disabled entirely:
|
||||
|
||||
```erb
|
||||
<%# locals: () %>
|
||||
```
|
||||
|
||||
*Joel Hawksley*
|
||||
|
||||
* Add `include_seconds` option for `datetime_local_field`
|
||||
|
||||
This allows to omit seconds part in the input field, by passing `include_seconds: false`
|
||||
|
||||
*Wojciech Wnętrzak*
|
||||
|
||||
* Guard against `ActionView::Helpers::FormTagHelper#field_name` calls with nil
|
||||
`object_name` arguments. For example:
|
||||
|
||||
```erb
|
||||
<%= fields do |f| %>
|
||||
<%= f.field_name :body %>
|
||||
<% end %>
|
||||
```
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Strings returned from `strip_tags` are correctly tagged `html_safe?`
|
||||
|
||||
Because these strings contain no HTML elements and the basic entities are escaped, they are safe
|
||||
to be included as-is as PCDATA in HTML content. Tagging them as html-safe avoids double-escaping
|
||||
entities when being concatenated to a SafeBuffer during rendering.
|
||||
|
||||
Fixes [rails/rails-html-sanitizer#124](https://github.com/rails/rails-html-sanitizer/issues/124)
|
||||
|
||||
*Mike Dalessio*
|
||||
|
||||
* Move `convert_to_model` call from `form_for` into `form_with`
|
||||
|
||||
Now that `form_for` is implemented in terms of `form_with`, remove the
|
||||
`convert_to_model` call from `form_for`.
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
|
||||
|
||||
Escape dangerous characters in names of tags and names of attributes in the
|
||||
tag helpers, following the XML specification. Rename the option
|
||||
`:escape_attributes` to `:escape`, to simplify by applying the option to the
|
||||
whole tag.
|
||||
|
||||
*Álvaro Martín Fraguas*
|
||||
|
||||
* Extend audio_tag and video_tag to accept Active Storage attachments.
|
||||
|
||||
Now it's possible to write
|
||||
|
||||
```ruby
|
||||
audio_tag(user.audio_file)
|
||||
video_tag(user.video_file)
|
||||
```
|
||||
|
||||
Instead of
|
||||
|
||||
```ruby
|
||||
audio_tag(polymorphic_path(user.audio_file))
|
||||
video_tag(polymorphic_path(user.video_file))
|
||||
```
|
||||
|
||||
`image_tag` already supported that, so this follows the same pattern.
|
||||
|
||||
*Matheus Richard*
|
||||
|
||||
* Ensure models passed to `form_for` attempt to call `to_model`.
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/actionview/CHANGELOG.md) for previous changes.
|
||||
Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/actionview/CHANGELOG.md) for previous changes.
|
||||
|
|
|
@ -8,9 +8,9 @@ module ActionView
|
|||
|
||||
module VERSION
|
||||
MAJOR = 7
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
TINY = 0
|
||||
PRE = "rc1"
|
||||
PRE = "alpha"
|
||||
|
||||
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@rails/ujs",
|
||||
"version": "7.1.0-rc1",
|
||||
"version": "7.2.0-alpha",
|
||||
"description": "Ruby on Rails unobtrusive scripting adapter",
|
||||
"main": "app/assets/javascripts/rails-ujs.js",
|
||||
"module": "app/assets/javascripts/rails-ujs.esm.js",
|
||||
|
|
|
@ -1,224 +1,2 @@
|
|||
## Rails 7.1.0.rc1 (September 27, 2023) ##
|
||||
|
||||
* Set `scheduled_at` attribute as a Time object instead of epoch seconds, and serialize and deserialize the value
|
||||
when enqueued. Assigning a numeric/epoch value to scheduled_at= is deprecated; use a Time object instead.
|
||||
|
||||
Deserializes `enqueued_at` as a Time instead of ISO8601 String.
|
||||
|
||||
*Ben Sheldon*
|
||||
|
||||
* Clarify the backoff strategy for the recommended `:wait` option when retrying jobs
|
||||
|
||||
`wait: :exponentially_longer` is waiting polynomially longer, so it is now recommended to use `wait: :polynomially_longer` to keep the same behavior.
|
||||
|
||||
*Victor Mours*
|
||||
|
||||
|
||||
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
||||
|
||||
* Fix Active Job log message to correctly report a job failed to enqueue
|
||||
when the adapter raises an `ActiveJob::EnqueueError`.
|
||||
|
||||
*Ben Sheldon*
|
||||
|
||||
* Add `after_discard` method.
|
||||
|
||||
This method lets job authors define a block which will be run when a job is about to be discarded. For example:
|
||||
|
||||
```ruby
|
||||
class AfterDiscardJob < ActiveJob::Base
|
||||
after_discard do |job, exception|
|
||||
Rails.logger.info("#{job.class} raised an exception: #{exception}")
|
||||
end
|
||||
|
||||
def perform
|
||||
raise StandardError
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
The above job will run the block passed to `after_discard` after the job is discarded. The exception will
|
||||
still be raised after the block has been run.
|
||||
|
||||
*Rob Cardy*
|
||||
|
||||
* Fix deserialization of ActiveSupport::Duration
|
||||
|
||||
Previously, a deserialized Duration would return an array from Duration#parts.
|
||||
It will now return a hash just like a regular Duration.
|
||||
|
||||
This also fixes an error when trying to add or subtract from a deserialized Duration
|
||||
(eg `duration + 1.year`).
|
||||
|
||||
*Jonathan del Strother*
|
||||
|
||||
* `perform_enqueued_jobs` is now compatible with all Active Job adapters
|
||||
|
||||
This means that methods that depend on it, like Action Mailer's `assert_emails`,
|
||||
will work correctly even if the test adapter is not used.
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Allow queue adapters to provide a custom name by implementing `queue_adapter_name`
|
||||
|
||||
*Sander Verdonschot*
|
||||
|
||||
* Log background job enqueue callers
|
||||
|
||||
Add `verbose_enqueue_logs` configuration option to display the caller
|
||||
of background job enqueue in the log to help with debugging.
|
||||
|
||||
Example log line:
|
||||
|
||||
```
|
||||
Enqueued AvatarThumbnailsJob (Job ID: ab528951-41fb-4c48-9129-3171791c27d6) to Sidekiq(default) with arguments: 1092412064
|
||||
↳ app/models/user.rb:421:in `generate_avatar_thumbnails'
|
||||
```
|
||||
|
||||
Enabled in development only for new and upgraded applications. Not recommended for use
|
||||
in the production environment since it relies on Ruby's `Kernel#caller` which is fairly slow.
|
||||
|
||||
*fatkodima*
|
||||
|
||||
* Set `provider_job_id` for Backburner jobs
|
||||
|
||||
*Cameron Matheson*
|
||||
|
||||
* Add `perform_all_later` to enqueue multiple jobs at once
|
||||
|
||||
This adds the ability to bulk enqueue jobs, without running callbacks, by
|
||||
passing multiple jobs or an array of jobs. For example:
|
||||
|
||||
```ruby
|
||||
ActiveJob.perform_all_later(MyJob.new("hello", 42), MyJob.new("world", 0))
|
||||
|
||||
user_jobs = User.pluck(:id).map { |id| UserJob.new(user_id: id) }
|
||||
ActiveJob.perform_all_later(user_jobs)
|
||||
```
|
||||
|
||||
This can greatly reduce the number of round-trips to the queue datastore.
|
||||
For queue adapters that do not implement the new `enqueue_all` method, we
|
||||
fall back to enqueuing jobs individually. The Sidekiq adapter implements
|
||||
`enqueue_all` with `push_bulk`.
|
||||
|
||||
This method does not use the existing `enqueue.active_job` event, but adds a
|
||||
new event `enqueue_all.active_job`.
|
||||
|
||||
*Sander Verdonschot*
|
||||
|
||||
* Don't double log the `job` when using `ActiveRecord::QueryLog`
|
||||
|
||||
Previously if you set `config.active_record.query_log_tags` to an array that included
|
||||
`:job`, the job name would get logged twice. This bug has been fixed.
|
||||
|
||||
*Alex Ghiculescu*
|
||||
|
||||
* Add support for Sidekiq's transaction-aware client
|
||||
|
||||
*Jonathan del Strother*
|
||||
|
||||
* Remove QueAdapter from Active Job.
|
||||
|
||||
After maintaining Active Job QueAdapter by Rails and Que side
|
||||
to support Ruby 3 keyword arguments and options provided as top level keywords,
|
||||
it is quite difficult to maintain it this way.
|
||||
|
||||
Active Job Que adapter can be included in the future version of que gem itself.
|
||||
|
||||
*Yasuo Honda*
|
||||
|
||||
* Fix BigDecimal (de)serialization for adapters using JSON.
|
||||
|
||||
Previously, BigDecimal was listed as not needing a serializer. However,
|
||||
when used with an adapter storing the job arguments as JSON, it would get
|
||||
serialized as a simple String, resulting in deserialization also producing
|
||||
a String (instead of a BigDecimal).
|
||||
|
||||
By using a serializer, we ensure the round trip is safe.
|
||||
|
||||
To ensure applications using BigDecimal job arguments are not subject to
|
||||
race conditions during deployment (where a replica running a version of
|
||||
Rails without BigDecimalSerializer fails to deserialize an argument
|
||||
serialized with it), `ActiveJob.use_big_decimal_serializer` is disabled by
|
||||
default, and can be set to true in a following deployment..
|
||||
|
||||
*Sam Bostock*
|
||||
|
||||
* Preserve full-precision `enqueued_at` timestamps for serialized jobs,
|
||||
allowing more accurate reporting of how long a job spent waiting in the
|
||||
queue before it was performed.
|
||||
|
||||
Retains IS08601 format compatibility.
|
||||
|
||||
*Jeremy Daer*
|
||||
|
||||
* Add `--parent` option to job generator to specify parent class of job.
|
||||
|
||||
Example:
|
||||
|
||||
`bin/rails g job process_payment --parent=payment_job` generates:
|
||||
|
||||
```ruby
|
||||
class ProcessPaymentJob < PaymentJob
|
||||
# ...
|
||||
end
|
||||
```
|
||||
|
||||
*Gannon McGibbon*
|
||||
|
||||
* Add more detailed description to job generator.
|
||||
|
||||
*Gannon McGibbon*
|
||||
|
||||
* `perform.active_job` notification payloads now include `:db_runtime`, which
|
||||
is the total time (in ms) taken by database queries while performing a job.
|
||||
This value can be used to better understand how a job's time is spent.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Update `ActiveJob::QueueAdapters::QueAdapter` to remove deprecation warning.
|
||||
|
||||
Remove a deprecation warning introduced in que 1.2 to prepare for changes in
|
||||
que 2.0 necessary for Ruby 3 compatibility.
|
||||
|
||||
*Damir Zekic* and *Adis Hasovic*
|
||||
|
||||
* Add missing `bigdecimal` require in `ActiveJob::Arguments`
|
||||
|
||||
Could cause `uninitialized constant ActiveJob::Arguments::BigDecimal (NameError)`
|
||||
when loading Active Job in isolation.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Allow testing `discard_on/retry_on ActiveJob::DeserializationError`
|
||||
|
||||
Previously in `perform_enqueued_jobs`, `deserialize_arguments_if_needed`
|
||||
was called before calling `perform_now`. When a record no longer exists
|
||||
and is serialized using GlobalID this led to raising
|
||||
an `ActiveJob::DeserializationError` before reaching `perform_now` call.
|
||||
This behavior makes difficult testing the job `discard_on/retry_on` logic.
|
||||
|
||||
Now `deserialize_arguments_if_needed` call is postponed to when `perform_now`
|
||||
is called.
|
||||
|
||||
Example:
|
||||
|
||||
```ruby
|
||||
class UpdateUserJob < ActiveJob::Base
|
||||
discard_on ActiveJob::DeserializationError
|
||||
|
||||
def perform(user)
|
||||
# ...
|
||||
end
|
||||
end
|
||||
|
||||
# In the test
|
||||
User.destroy_all
|
||||
assert_nothing_raised do
|
||||
perform_enqueued_jobs only: UpdateUserJob
|
||||
end
|
||||
```
|
||||
|
||||
*Jacopo Beschi*
|
||||
|
||||
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/activejob/CHANGELOG.md) for previous changes.
|
||||
Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/activejob/CHANGELOG.md) for previous changes.
|
||||
|
|
|
@ -8,9 +8,9 @@ module ActiveJob
|
|||
|
||||
module VERSION
|
||||
MAJOR = 7
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
TINY = 0
|
||||
PRE = "rc1"
|
||||
PRE = "alpha"
|
||||
|
||||
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
||||
end
|
||||
|
|
|
@ -1,217 +1,2 @@
|
|||
## Rails 7.1.0.rc1 (September 27, 2023) ##
|
||||
|
||||
* Remove change in the typography of user facing error messages.
|
||||
For example, “can’t be blank” is again “can't be blank”.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
|
||||
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
||||
|
||||
* Support composite identifiers in `to_key`
|
||||
|
||||
`to_key` avoids wrapping `#id` value into an `Array` if `#id` already an array
|
||||
|
||||
*Nikita Vasilevsky*
|
||||
|
||||
* Add `ActiveModel::Conversion.param_delimiter` to configure delimiter being used in `to_param`
|
||||
|
||||
*Nikita Vasilevsky*
|
||||
|
||||
* `undefine_attribute_methods` undefines alias attribute methods along with attribute methods.
|
||||
|
||||
*Nikita Vasilevsky*
|
||||
|
||||
* Error.full_message now strips ":base" from the message.
|
||||
|
||||
*zzak*
|
||||
|
||||
* Add a load hook for `ActiveModel::Model` (named `active_model`) to match the load hook for
|
||||
`ActiveRecord::Base` and allow for overriding aspects of the `ActiveModel::Model` class.
|
||||
|
||||
*Lewis Buckley*
|
||||
|
||||
* Improve password length validation in ActiveModel::SecurePassword to consider byte size for BCrypt
|
||||
compatibility.
|
||||
|
||||
The previous password length validation only considered the character count, which may not
|
||||
accurately reflect the 72-byte size limit imposed by BCrypt. This change updates the validation
|
||||
to consider both character count and byte size while keeping the character length validation in place.
|
||||
|
||||
```ruby
|
||||
user = User.new(password: "a" * 73) # 73 characters
|
||||
user.valid? # => false
|
||||
user.errors[:password] # => ["is too long"]
|
||||
|
||||
|
||||
user = User.new(password: "あ" * 25) # 25 characters, 75 bytes
|
||||
user.valid? # => false
|
||||
user.errors[:password] # => ["is too long"]
|
||||
```
|
||||
|
||||
*ChatGPT*, *Guillermo Iguaran*
|
||||
|
||||
* `has_secure_password` now generates an `#{attribute}_salt` method that returns the salt
|
||||
used to compute the password digest. The salt will change whenever the password is changed,
|
||||
so it can be used to create single-use password reset tokens with `generates_token_for`:
|
||||
|
||||
```ruby
|
||||
class User < ActiveRecord::Base
|
||||
has_secure_password
|
||||
|
||||
generates_token_for :password_reset, expires_in: 15.minutes do
|
||||
password_salt&.last(10)
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
*Lázaro Nixon*
|
||||
|
||||
* Improve typography of user facing error messages. In English contractions,
|
||||
the Unicode APOSTROPHE (`U+0027`) is now RIGHT SINGLE QUOTATION MARK
|
||||
(`U+2019`). For example, "can't be blank" is now "can’t be blank".
|
||||
|
||||
*Jon Dufresne*
|
||||
|
||||
* Add class to `ActiveModel::MissingAttributeError` error message.
|
||||
|
||||
Show which class is missing the attribute in the error message:
|
||||
|
||||
```ruby
|
||||
user = User.first
|
||||
user.pets.select(:id).first.user_id
|
||||
# => ActiveModel::MissingAttributeError: missing attribute 'user_id' for Pet
|
||||
```
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
* Raise `NoMethodError` in `ActiveModel::Type::Value#as_json` to avoid unpredictable
|
||||
results.
|
||||
|
||||
*Vasiliy Ermolovich*
|
||||
|
||||
* Custom attribute types that inherit from Active Model built-in types and do
|
||||
not override the `serialize` method will now benefit from an optimization
|
||||
when serializing attribute values for the database.
|
||||
|
||||
For example, with a custom type like the following:
|
||||
|
||||
```ruby
|
||||
class DowncasedString < ActiveModel::Type::String
|
||||
def cast(value)
|
||||
super&.downcase
|
||||
end
|
||||
end
|
||||
|
||||
ActiveRecord::Type.register(:downcased_string, DowncasedString)
|
||||
|
||||
class User < ActiveRecord::Base
|
||||
attribute :email, :downcased_string
|
||||
end
|
||||
|
||||
user = User.new(email: "FooBar@example.com")
|
||||
```
|
||||
|
||||
Serializing the `email` attribute for the database will be roughly twice as
|
||||
fast. More expensive `cast` operations will likely see greater improvements.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* `has_secure_password` now supports password challenges via a
|
||||
`password_challenge` accessor and validation.
|
||||
|
||||
A password challenge is a safeguard to verify that the current user is
|
||||
actually the password owner. It can be used when changing sensitive model
|
||||
fields, such as the password itself. It is different than a password
|
||||
confirmation, which is used to prevent password typos.
|
||||
|
||||
When `password_challenge` is set, the validation checks that the value's
|
||||
digest matches the *currently persisted* `password_digest` (i.e.
|
||||
`password_digest_was`).
|
||||
|
||||
This allows a password challenge to be done as part of a typical `update`
|
||||
call, just like a password confirmation. It also allows a password
|
||||
challenge error to be handled in the same way as other validation errors.
|
||||
|
||||
For example, in the controller, instead of:
|
||||
|
||||
```ruby
|
||||
password_params = params.require(:password).permit(
|
||||
:password_challenge,
|
||||
:password,
|
||||
:password_confirmation,
|
||||
)
|
||||
|
||||
password_challenge = password_params.delete(:password_challenge)
|
||||
@password_challenge_failed = !current_user.authenticate(password_challenge)
|
||||
|
||||
if !@password_challenge_failed && current_user.update(password_params)
|
||||
# ...
|
||||
end
|
||||
```
|
||||
|
||||
You can now write:
|
||||
|
||||
```ruby
|
||||
password_params = params.require(:password).permit(
|
||||
:password_challenge,
|
||||
:password,
|
||||
:password_confirmation,
|
||||
).with_defaults(password_challenge: "")
|
||||
|
||||
if current_user.update(password_params)
|
||||
# ...
|
||||
end
|
||||
```
|
||||
|
||||
And, in the view, instead of checking `@password_challenge_failed`, you can
|
||||
render an error for the `password_challenge` field just as you would for
|
||||
other form fields, including utilizing `config.action_view.field_error_proc`.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Support infinite ranges for `LengthValidator`s `:in`/`:within` options
|
||||
|
||||
```ruby
|
||||
validates_length_of :first_name, in: ..30
|
||||
```
|
||||
|
||||
*fatkodima*
|
||||
|
||||
* Add support for beginless ranges to inclusivity/exclusivity validators:
|
||||
|
||||
```ruby
|
||||
validates_inclusion_of :birth_date, in: -> { (..Date.today) }
|
||||
```
|
||||
|
||||
```ruby
|
||||
validates_exclusion_of :birth_date, in: -> { (..Date.today) }
|
||||
```
|
||||
|
||||
*Bo Jeanes*
|
||||
|
||||
* Make validators accept lambdas without record argument
|
||||
|
||||
```ruby
|
||||
# Before
|
||||
validates_comparison_of :birth_date, less_than_or_equal_to: ->(_record) { Date.today }
|
||||
|
||||
# After
|
||||
validates_comparison_of :birth_date, less_than_or_equal_to: -> { Date.today }
|
||||
```
|
||||
|
||||
*fatkodima*
|
||||
|
||||
* Fix casting long strings to `Date`, `Time` or `DateTime`
|
||||
|
||||
*fatkodima*
|
||||
|
||||
* Use different cache namespace for proxy calls
|
||||
|
||||
Models can currently have different attribute bodies for the same method
|
||||
names, leading to conflicts. Adding a new namespace `:active_model_proxy`
|
||||
fixes the issue.
|
||||
|
||||
*Chris Salzberg*
|
||||
|
||||
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/activemodel/CHANGELOG.md) for previous changes.
|
||||
Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/activemodel/CHANGELOG.md) for previous changes.
|
||||
|
|
|
@ -8,9 +8,9 @@ module ActiveModel
|
|||
|
||||
module VERSION
|
||||
MAJOR = 7
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
TINY = 0
|
||||
PRE = "rc1"
|
||||
PRE = "alpha"
|
||||
|
||||
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
||||
end
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -139,7 +139,7 @@ A short rundown of some of the major features:
|
|||
|
||||
* Database agnostic schema management with Migrations.
|
||||
|
||||
class AddSystemSettings < ActiveRecord::Migration[7.1]
|
||||
class AddSystemSettings < ActiveRecord::Migration[7.2]
|
||||
def up
|
||||
create_table :system_settings do |t|
|
||||
t.string :name
|
||||
|
|
|
@ -1905,7 +1905,7 @@ module ActiveRecord
|
|||
# The join table should not have a primary key or a model associated with it. You must manually generate the
|
||||
# join table with a migration such as this:
|
||||
#
|
||||
# class CreateDevelopersProjectsJoinTable < ActiveRecord::Migration[7.1]
|
||||
# class CreateDevelopersProjectsJoinTable < ActiveRecord::Migration[7.2]
|
||||
# def change
|
||||
# create_join_table :developers, :projects
|
||||
# end
|
||||
|
|
|
@ -348,7 +348,7 @@ module ActiveRecord
|
|||
# Inside migration files, the +t+ object in {create_table}[rdoc-ref:SchemaStatements#create_table]
|
||||
# is actually of this type:
|
||||
#
|
||||
# class SomeMigration < ActiveRecord::Migration[7.1]
|
||||
# class SomeMigration < ActiveRecord::Migration[7.2]
|
||||
# def up
|
||||
# create_table :foo do |t|
|
||||
# puts t.class # => "ActiveRecord::ConnectionAdapters::TableDefinition"
|
||||
|
|
|
@ -8,9 +8,9 @@ module ActiveRecord
|
|||
|
||||
module VERSION
|
||||
MAJOR = 7
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
TINY = 0
|
||||
PRE = "rc1"
|
||||
PRE = "alpha"
|
||||
|
||||
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
||||
end
|
||||
|
|
|
@ -20,7 +20,7 @@ module ActiveRecord
|
|||
# For example the following migration is not reversible.
|
||||
# Rolling back this migration will raise an ActiveRecord::IrreversibleMigration error.
|
||||
#
|
||||
# class IrreversibleMigrationExample < ActiveRecord::Migration[7.1]
|
||||
# class IrreversibleMigrationExample < ActiveRecord::Migration[7.2]
|
||||
# def change
|
||||
# create_table :distributors do |t|
|
||||
# t.string :zipcode
|
||||
|
@ -38,7 +38,7 @@ module ActiveRecord
|
|||
#
|
||||
# 1. Define <tt>#up</tt> and <tt>#down</tt> methods instead of <tt>#change</tt>:
|
||||
#
|
||||
# class ReversibleMigrationExample < ActiveRecord::Migration[7.1]
|
||||
# class ReversibleMigrationExample < ActiveRecord::Migration[7.2]
|
||||
# def up
|
||||
# create_table :distributors do |t|
|
||||
# t.string :zipcode
|
||||
|
@ -63,7 +63,7 @@ module ActiveRecord
|
|||
#
|
||||
# 2. Use the #reversible method in <tt>#change</tt> method:
|
||||
#
|
||||
# class ReversibleMigrationExample < ActiveRecord::Migration[7.1]
|
||||
# class ReversibleMigrationExample < ActiveRecord::Migration[7.2]
|
||||
# def change
|
||||
# create_table :distributors do |t|
|
||||
# t.string :zipcode
|
||||
|
@ -234,7 +234,7 @@ module ActiveRecord
|
|||
#
|
||||
# Example of a simple migration:
|
||||
#
|
||||
# class AddSsl < ActiveRecord::Migration[7.1]
|
||||
# class AddSsl < ActiveRecord::Migration[7.2]
|
||||
# def up
|
||||
# add_column :accounts, :ssl_enabled, :boolean, default: true
|
||||
# end
|
||||
|
@ -254,7 +254,7 @@ module ActiveRecord
|
|||
#
|
||||
# Example of a more complex migration that also needs to initialize data:
|
||||
#
|
||||
# class AddSystemSettings < ActiveRecord::Migration[7.1]
|
||||
# class AddSystemSettings < ActiveRecord::Migration[7.2]
|
||||
# def up
|
||||
# create_table :system_settings do |t|
|
||||
# t.string :name
|
||||
|
@ -382,7 +382,7 @@ module ActiveRecord
|
|||
# bin/rails generate migration add_fieldname_to_tablename fieldname:string
|
||||
#
|
||||
# This will generate the file <tt>timestamp_add_fieldname_to_tablename.rb</tt>, which will look like this:
|
||||
# class AddFieldnameToTablename < ActiveRecord::Migration[7.1]
|
||||
# class AddFieldnameToTablename < ActiveRecord::Migration[7.2]
|
||||
# def change
|
||||
# add_column :tablenames, :fieldname, :string
|
||||
# end
|
||||
|
@ -408,7 +408,7 @@ module ActiveRecord
|
|||
#
|
||||
# Not all migrations change the schema. Some just fix the data:
|
||||
#
|
||||
# class RemoveEmptyTags < ActiveRecord::Migration[7.1]
|
||||
# class RemoveEmptyTags < ActiveRecord::Migration[7.2]
|
||||
# def up
|
||||
# Tag.all.each { |tag| tag.destroy if tag.pages.empty? }
|
||||
# end
|
||||
|
@ -421,7 +421,7 @@ module ActiveRecord
|
|||
#
|
||||
# Others remove columns when they migrate up instead of down:
|
||||
#
|
||||
# class RemoveUnnecessaryItemAttributes < ActiveRecord::Migration[7.1]
|
||||
# class RemoveUnnecessaryItemAttributes < ActiveRecord::Migration[7.2]
|
||||
# def up
|
||||
# remove_column :items, :incomplete_items_count
|
||||
# remove_column :items, :completed_items_count
|
||||
|
@ -435,7 +435,7 @@ module ActiveRecord
|
|||
#
|
||||
# And sometimes you need to do something in SQL not abstracted directly by migrations:
|
||||
#
|
||||
# class MakeJoinUnique < ActiveRecord::Migration[7.1]
|
||||
# class MakeJoinUnique < ActiveRecord::Migration[7.2]
|
||||
# def up
|
||||
# execute "ALTER TABLE `pages_linked_pages` ADD UNIQUE `page_id_linked_page_id` (`page_id`,`linked_page_id`)"
|
||||
# end
|
||||
|
@ -452,7 +452,7 @@ module ActiveRecord
|
|||
# <tt>Base#reset_column_information</tt> in order to ensure that the model has the
|
||||
# latest column data from after the new column was added. Example:
|
||||
#
|
||||
# class AddPeopleSalary < ActiveRecord::Migration[7.1]
|
||||
# class AddPeopleSalary < ActiveRecord::Migration[7.2]
|
||||
# def up
|
||||
# add_column :people, :salary, :integer
|
||||
# Person.reset_column_information
|
||||
|
@ -510,7 +510,7 @@ module ActiveRecord
|
|||
# To define a reversible migration, define the +change+ method in your
|
||||
# migration like this:
|
||||
#
|
||||
# class TenderloveMigration < ActiveRecord::Migration[7.1]
|
||||
# class TenderloveMigration < ActiveRecord::Migration[7.2]
|
||||
# def change
|
||||
# create_table(:horses) do |t|
|
||||
# t.column :content, :text
|
||||
|
@ -540,7 +540,7 @@ module ActiveRecord
|
|||
# can't execute inside a transaction though, and for these situations
|
||||
# you can turn the automatic transactions off.
|
||||
#
|
||||
# class ChangeEnum < ActiveRecord::Migration[7.1]
|
||||
# class ChangeEnum < ActiveRecord::Migration[7.2]
|
||||
# disable_ddl_transaction!
|
||||
#
|
||||
# def up
|
||||
|
@ -810,7 +810,7 @@ module ActiveRecord
|
|||
# and create the table 'apples' on the way up, and the reverse
|
||||
# on the way down.
|
||||
#
|
||||
# class FixTLMigration < ActiveRecord::Migration[7.1]
|
||||
# class FixTLMigration < ActiveRecord::Migration[7.2]
|
||||
# def change
|
||||
# revert do
|
||||
# create_table(:horses) do |t|
|
||||
|
@ -829,7 +829,7 @@ module ActiveRecord
|
|||
#
|
||||
# require_relative "20121212123456_tenderlove_migration"
|
||||
#
|
||||
# class FixupTLMigration < ActiveRecord::Migration[7.1]
|
||||
# class FixupTLMigration < ActiveRecord::Migration[7.2]
|
||||
# def change
|
||||
# revert TenderloveMigration
|
||||
#
|
||||
|
@ -880,7 +880,7 @@ module ActiveRecord
|
|||
# when the three columns 'first_name', 'last_name' and 'full_name' exist,
|
||||
# even when migrating down:
|
||||
#
|
||||
# class SplitNameMigration < ActiveRecord::Migration[7.1]
|
||||
# class SplitNameMigration < ActiveRecord::Migration[7.2]
|
||||
# def change
|
||||
# add_column :users, :first_name, :string
|
||||
# add_column :users, :last_name, :string
|
||||
|
@ -908,7 +908,7 @@ module ActiveRecord
|
|||
# In the following example, the new column +published+ will be given
|
||||
# the value +true+ for all existing records.
|
||||
#
|
||||
# class AddPublishedToPosts < ActiveRecord::Migration[7.1]
|
||||
# class AddPublishedToPosts < ActiveRecord::Migration[7.2]
|
||||
# def change
|
||||
# add_column :posts, :published, :boolean, default: false
|
||||
# up_only do
|
||||
|
|
|
@ -21,8 +21,7 @@ module ActiveRecord
|
|||
# New migration functionality that will never be backward compatible should be added directly to `ActiveRecord::Migration`.
|
||||
#
|
||||
# There are classes for each prior Rails version. Each class descends from the *next* Rails version, so:
|
||||
# 7.0 < 7.1
|
||||
# 5.2 < 6.0 < 6.1 < 7.0 < 7.1
|
||||
# 5.2 < 6.0 < 6.1 < 7.0 < 7.1 < 7.2
|
||||
#
|
||||
# If you are introducing new migration functionality that should only apply from Rails 7 onward, then you should
|
||||
# find the class that immediately precedes it (6.1), and override the relevant migration methods to undo your changes.
|
||||
|
@ -30,7 +29,10 @@ module ActiveRecord
|
|||
# For example, Rails 6 added a default value for the `precision` option on datetime columns. So in this file, the `V5_2`
|
||||
# class sets the value of `precision` to `nil` if it's not explicitly provided. This way, the default value will not apply
|
||||
# for migrations written for 5.2, but will for migrations written for 6.0.
|
||||
V7_1 = Current
|
||||
V7_2 = Current
|
||||
|
||||
class V7_1 < V7_2
|
||||
end
|
||||
|
||||
class V7_0 < V7_1
|
||||
module LegacyIndexName
|
||||
|
|
|
@ -525,7 +525,7 @@ module ActiveRecord
|
|||
# when just after creating a table you want to populate it with some default
|
||||
# values, e.g.:
|
||||
#
|
||||
# class CreateJobLevels < ActiveRecord::Migration[7.1]
|
||||
# class CreateJobLevels < ActiveRecord::Migration[7.2]
|
||||
# def up
|
||||
# create_table :job_levels do |t|
|
||||
# t.integer :id
|
||||
|
|
|
@ -1,242 +1,2 @@
|
|||
## Rails 7.1.0.rc1 (September 27, 2023) ##
|
||||
|
||||
* Add `expires_at` option to `ActiveStorage::Blob#signed_id`.
|
||||
|
||||
```ruby
|
||||
rails_blob_path(user.avatar, disposition: "attachment", expires_at: 30.minutes.from_now)
|
||||
<%= image_tag rails_blob_path(user.avatar.variant(resize: "100x100"), expires_at: 30.minutes.from_now) %>
|
||||
```
|
||||
|
||||
*Aki*
|
||||
|
||||
* Allow attaching File and Pathname when assigning attributes, e.g.
|
||||
|
||||
```ruby
|
||||
User.create!(avatar: File.open("image.jpg"))
|
||||
User.create!(avatar: file_fixture("image.jpg"))
|
||||
```
|
||||
|
||||
*Dorian Marié*
|
||||
|
||||
|
||||
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
||||
|
||||
* Disables the session in `ActiveStorage::Blobs::ProxyController`
|
||||
and `ActiveStorage::Representations::ProxyController`
|
||||
in order to allow caching by default in some CDNs as CloudFlare
|
||||
|
||||
Fixes #44136
|
||||
|
||||
*Bruno Prieto*
|
||||
|
||||
* Add `tags` to `ActiveStorage::Analyzer::AudioAnalyzer` output
|
||||
|
||||
*Keaton Roux*
|
||||
|
||||
* Add an option to preprocess variants
|
||||
|
||||
ActiveStorage variants are processed on the fly when they are needed but
|
||||
sometimes we're sure that they are accessed and want to processed them
|
||||
upfront.
|
||||
|
||||
`preprocessed` option is added when declaring variants.
|
||||
|
||||
```
|
||||
class User < ApplicationRecord
|
||||
has_one_attached :avatar do |attachable|
|
||||
attachable.variant :thumb, resize_to_limit: [100, 100], preprocessed: true
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
*Shouichi Kamiya*
|
||||
|
||||
* Fix variants not included when eager loading multiple records containing a single attachment
|
||||
|
||||
When using the `with_attached_#{name}` scope for a `has_one_attached` relation,
|
||||
attachment variants were not eagerly loaded.
|
||||
|
||||
*Russell Porter*
|
||||
|
||||
* Allow an ActiveStorage attachment to be removed via a form post
|
||||
|
||||
Attachments can already be removed by updating the attachment to be nil such as:
|
||||
```ruby
|
||||
User.find(params[:id]).update!(avatar: nil)
|
||||
```
|
||||
|
||||
However, a form cannot post a nil param, it can only post an empty string. But, posting an
|
||||
empty string would result in an `ActiveSupport::MessageVerifier::InvalidSignature: mismatched digest`
|
||||
error being raised, because it's being treated as a signed blob id.
|
||||
|
||||
Now, nil and an empty string are treated as a delete, which allows attachments to be removed via:
|
||||
```ruby
|
||||
User.find(params[:id]).update!(params.require(:user).permit(:avatar))
|
||||
|
||||
```
|
||||
|
||||
*Nate Matykiewicz*
|
||||
|
||||
* Remove mini_mime usage in favour of marcel.
|
||||
|
||||
We have two libraries that are have similar usage. This change removes
|
||||
dependency on mini_mime and makes use of similar methods from marcel.
|
||||
|
||||
*Vipul A M*
|
||||
|
||||
* Allow destroying active storage variants
|
||||
|
||||
```ruby
|
||||
User.first.avatar.variant(resize_to_limit: [100, 100]).destroy
|
||||
```
|
||||
|
||||
*Shouichi Kamiya*, *Yuichiro NAKAGAWA*, *Ryohei UEDA*
|
||||
|
||||
* Add `sample_rate` to `ActiveStorage::Analyzer::AudioAnalyzer` output
|
||||
|
||||
*Matija Čupić*
|
||||
|
||||
* Remove deprecated `purge` and `purge_later` methods from the attachments association.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated behavior when assigning to a collection of attachments.
|
||||
|
||||
Instead of appending to the collection, the collection is now replaced.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated `ActiveStorage::Current#host` and `ActiveStorage::Current#host=` methods.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Remove deprecated invalid default content types in Active Storage configurations.
|
||||
|
||||
*Rafael Mendonça França*
|
||||
|
||||
* Add missing preview event to `ActiveStorage::LogSubscriber`
|
||||
|
||||
A `preview` event is being instrumented in `ActiveStorage::Previewer`.
|
||||
However it was not added inside ActiveStorage's LogSubscriber class.
|
||||
|
||||
This will allow to have logs for when a preview happens
|
||||
in the same fashion as all other ActiveStorage events such as
|
||||
`upload` and `download` inside `Rails.logger`.
|
||||
|
||||
*Chedli Bourguiba*
|
||||
|
||||
* Fix retrieving rotation value from FFmpeg on version 5.0+.
|
||||
|
||||
In FFmpeg version 5.0+ the rotation value has been removed from tags.
|
||||
Instead the value can be found in side_data_list. Along with
|
||||
this update it's possible to have values of -90, -270 to denote the video
|
||||
has been rotated.
|
||||
|
||||
*Haroon Ahmed*
|
||||
|
||||
* Touch all corresponding model records after ActiveStorage::Blob is analyzed
|
||||
|
||||
This fixes a race condition where a record can be requested and have a cache entry built, before
|
||||
the initial `analyze_later` completes, which will not be invalidated until something else
|
||||
updates the record. This also invalidates cache entries when a blob is re-analyzed, which
|
||||
is helpful if a bug is fixed in an analyzer or a new analyzer is added.
|
||||
|
||||
*Nate Matykiewicz*
|
||||
|
||||
* Add ability to use pre-defined variants when calling `preview` or
|
||||
`representation` on an attachment.
|
||||
|
||||
```ruby
|
||||
class User < ActiveRecord::Base
|
||||
has_one_attached :file do |attachable|
|
||||
attachable.variant :thumb, resize_to_limit: [100, 100]
|
||||
end
|
||||
end
|
||||
|
||||
<%= image_tag user.file.representation(:thumb) %>
|
||||
```
|
||||
|
||||
*Richard Böhme*
|
||||
|
||||
* Method `attach` always returns the attachments except when the record
|
||||
is persisted, unchanged, and saving it fails, in which case it returns `nil`.
|
||||
|
||||
*Santiago Bartesaghi*
|
||||
|
||||
* Fixes multiple `attach` calls within transaction not uploading files correctly.
|
||||
|
||||
In the following example, the code failed to upload all but the last file to the configured service.
|
||||
```ruby
|
||||
ActiveRecord::Base.transaction do
|
||||
user.attachments.attach({
|
||||
content_type: "text/plain",
|
||||
filename: "dummy.txt",
|
||||
io: ::StringIO.new("dummy"),
|
||||
})
|
||||
user.attachments.attach({
|
||||
content_type: "text/plain",
|
||||
filename: "dummy2.txt",
|
||||
io: ::StringIO.new("dummy2"),
|
||||
})
|
||||
end
|
||||
|
||||
assert_equal 2, user.attachments.count
|
||||
assert user.attachments.first.service.exist?(user.attachments.first.key) # Fails
|
||||
```
|
||||
|
||||
This was addressed by keeping track of the subchanges pending upload, and uploading them
|
||||
once the transaction is committed.
|
||||
|
||||
Fixes #41661
|
||||
|
||||
*Santiago Bartesaghi*, *Bruno Vezoli*, *Juan Roig*, *Abhay Nikam*
|
||||
|
||||
* Raise an exception if `config.active_storage.service` is not set.
|
||||
|
||||
If Active Storage is configured and `config.active_storage.service` is not
|
||||
set in the respective environment's configuration file, then an exception
|
||||
is raised with a meaningful message when attempting to use Active Storage.
|
||||
|
||||
*Ghouse Mohamed*
|
||||
|
||||
* Fixes proxy downloads of files over 5mb
|
||||
|
||||
Previously, trying to view and/or download files larger than 5mb stored in
|
||||
services like S3 via proxy mode could return corrupted files at around
|
||||
5.2mb or cause random halts in the download. Now,
|
||||
`ActiveStorage::Blobs::ProxyController` correctly handles streaming these
|
||||
larger files from the service to the client without any issues.
|
||||
|
||||
Fixes #44679
|
||||
|
||||
*Felipe Raul*
|
||||
|
||||
* Saving attachment(s) to a record returns the blob/blobs object
|
||||
|
||||
Previously, saving attachments did not return the blob/blobs that
|
||||
were attached. Now, saving attachments to a record with `#attach`
|
||||
method returns the blob or array of blobs that were attached to
|
||||
the record. If it fails to save the attachment(s), then it returns
|
||||
`false`.
|
||||
|
||||
*Ghouse Mohamed*
|
||||
|
||||
* Don't stream responses in redirect mode
|
||||
|
||||
Previously, both redirect mode and proxy mode streamed their
|
||||
responses which caused a new thread to be created, and could end
|
||||
up leaking connections in the connection pool. But since redirect
|
||||
mode doesn't actually send any data, it doesn't need to be
|
||||
streamed.
|
||||
|
||||
*Luke Lau*
|
||||
|
||||
* Safe for direct upload on Libraries or Frameworks
|
||||
|
||||
Enable the use of custom headers during direct uploads, which allows for
|
||||
the inclusion of Authorization bearer tokens or other forms of authorization
|
||||
tokens through headers.
|
||||
|
||||
*Radamés Roriz*
|
||||
|
||||
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/activestorage/CHANGELOG.md) for previous changes.
|
||||
Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/activestorage/CHANGELOG.md) for previous changes.
|
||||
|
|
|
@ -8,9 +8,9 @@ module ActiveStorage
|
|||
|
||||
module VERSION
|
||||
MAJOR = 7
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
TINY = 0
|
||||
PRE = "rc1"
|
||||
PRE = "alpha"
|
||||
|
||||
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@rails/activestorage",
|
||||
"version": "7.1.0-rc1",
|
||||
"version": "7.2.0-alpha",
|
||||
"description": "Attach cloud and local files in Rails applications",
|
||||
"module": "app/assets/javascripts/activestorage.esm.js",
|
||||
"main": "app/assets/javascripts/activestorage.js",
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -65,7 +65,7 @@ module ActiveSupport
|
|||
# and the second is a library name.
|
||||
#
|
||||
# ActiveSupport::Deprecation.new('2.0', 'MyLibrary')
|
||||
def initialize(deprecation_horizon = "7.2", gem_name = "Rails")
|
||||
def initialize(deprecation_horizon = "7.3", gem_name = "Rails")
|
||||
self.gem_name = gem_name
|
||||
self.deprecation_horizon = deprecation_horizon
|
||||
# By default, warnings are not silenced and debugging is off.
|
||||
|
|
|
@ -8,9 +8,9 @@ module ActiveSupport
|
|||
|
||||
module VERSION
|
||||
MAJOR = 7
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
TINY = 0
|
||||
PRE = "rc1"
|
||||
PRE = "alpha"
|
||||
|
||||
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
||||
end
|
||||
|
|
|
@ -1,12 +1,2 @@
|
|||
## Rails 7.1.0.rc1 (September 27, 2023) ##
|
||||
|
||||
* No changes.
|
||||
|
||||
|
||||
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
||||
|
||||
* Add "back to top" button to guides
|
||||
|
||||
*Alysson Rosa*
|
||||
|
||||
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/guides/CHANGELOG.md) for previous changes.
|
||||
Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/guides/CHANGELOG.md) for previous changes.
|
||||
|
|
|
@ -28,7 +28,7 @@ end
|
|||
class Payment < ActiveRecord::Base
|
||||
end
|
||||
|
||||
class ChangeAmountToAddScale < ActiveRecord::Migration[7.1]
|
||||
class ChangeAmountToAddScale < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
reversible do |dir|
|
||||
dir.up do
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
**DO NOT READ THIS FILE ON GITHUB, GUIDES ARE PUBLISHED ON https://guides.rubyonrails.org.**
|
||||
|
||||
Ruby on Rails 7.2 Release Notes
|
||||
===============================
|
||||
|
||||
Highlights in Rails 7.2:
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Upgrading to Rails 7.1
|
||||
----------------------
|
||||
|
||||
If you're upgrading an existing application, it's a great idea to have good test
|
||||
coverage before going in. You should also first upgrade to Rails 7.1 in case you
|
||||
haven't and make sure your application still runs as expected before attempting
|
||||
an update to Rails 7.2. A list of things to watch out for when upgrading is
|
||||
available in the
|
||||
[Upgrading Ruby on Rails](upgrading_ruby_on_rails.html#upgrading-from-rails-7-1-to-rails-7-2)
|
||||
guide.
|
||||
|
||||
Major Features
|
||||
--------------
|
||||
|
||||
|
||||
Railties
|
||||
--------
|
||||
|
||||
Action Cable
|
||||
------------
|
||||
|
||||
Action Pack
|
||||
-----------
|
||||
|
||||
Action View
|
||||
-----------
|
||||
|
||||
Action Mailer
|
||||
-------------
|
||||
|
||||
Active Record
|
||||
-------------
|
||||
|
||||
Active Storage
|
||||
--------------
|
||||
|
||||
Active Model
|
||||
------------
|
||||
|
||||
Active Support
|
||||
--------------
|
||||
|
||||
Active Job
|
||||
----------
|
||||
|
||||
Action Text
|
||||
----------
|
||||
|
||||
Action Mailbox
|
||||
----------
|
||||
|
||||
Ruby on Rails Guides
|
||||
--------------------
|
||||
|
||||
Please refer to the [Changelog][guides] for detailed changes.
|
||||
|
||||
### Notable changes
|
||||
|
||||
Credits
|
||||
-------
|
||||
|
||||
See the
|
||||
[full list of contributors to Rails](https://contributors.rubyonrails.org/)
|
||||
for the many people who spent many hours making Rails, the stable and robust
|
||||
framework it is. Kudos to all of them.
|
||||
|
||||
[railties]: https://github.com/rails/rails/blob/main/railties/CHANGELOG.md
|
||||
[action-pack]: https://github.com/rails/rails/blob/main/actionpack/CHANGELOG.md
|
||||
[action-view]: https://github.com/rails/rails/blob/main/actionview/CHANGELOG.md
|
||||
[action-mailer]: https://github.com/rails/rails/blob/main/actionmailer/CHANGELOG.md
|
||||
[action-cable]: https://github.com/rails/rails/blob/main/actioncable/CHANGELOG.md
|
||||
[active-record]: https://github.com/rails/rails/blob/main/activerecord/CHANGELOG.md
|
||||
[active-storage]: https://github.com/rails/rails/blob/main/activestorage/CHANGELOG.md
|
||||
[active-model]: https://github.com/rails/rails/blob/main/activemodel/CHANGELOG.md
|
||||
[active-support]: https://github.com/rails/rails/blob/main/activesupport/CHANGELOG.md
|
||||
[active-job]: https://github.com/rails/rails/blob/main/activejob/CHANGELOG.md
|
||||
[action-text]: https://github.com/rails/rails/blob/main/actiontext/CHANGELOG.md
|
||||
[action-mailbox]: https://github.com/rails/rails/blob/main/actionmailbox/CHANGELOG.md
|
||||
[guides]: https://github.com/rails/rails/blob/main/guides/CHANGELOG.md
|
|
@ -10,12 +10,13 @@
|
|||
</p>
|
||||
<% else %>
|
||||
<p>
|
||||
These are the new guides for Rails 7.1 based on <a href="https://github.com/rails/rails/tree/<%= @version %>"><%= @version %></a>.
|
||||
These are the new guides for Rails 7.2 based on <a href="https://github.com/rails/rails/tree/<%= @version %>"><%= @version %></a>.
|
||||
These guides are designed to make you immediately productive with Rails, and to help you understand how all of the pieces fit together.
|
||||
</p>
|
||||
<% end %>
|
||||
<p>
|
||||
The guides for earlier releases:
|
||||
<a href="https://guides.rubyonrails.org/v7.1/" data-turbo="false">Rails 7.1</a>,
|
||||
<a href="https://guides.rubyonrails.org/v7.0/" data-turbo="false">Rails 7.0</a>,
|
||||
<a href="https://guides.rubyonrails.org/v6.1/" data-turbo="false">Rails 6.1</a>,
|
||||
<a href="https://guides.rubyonrails.org/v6.0/" data-turbo="false">Rails 6.0</a>,
|
||||
|
|
|
@ -410,7 +410,7 @@ in files which are executed against any database that Active Record supports.
|
|||
Here's a migration that creates a new table called `publications`:
|
||||
|
||||
```ruby
|
||||
class CreatePublications < ActiveRecord::Migration[7.1]
|
||||
class CreatePublications < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :publications do |t|
|
||||
t.string :title
|
||||
|
|
|
@ -36,7 +36,7 @@ You can create a table with a composite primary key by passing the
|
|||
`:primary_key` option to `create_table` with an array value:
|
||||
|
||||
```ruby
|
||||
class CreateProducts < ActiveRecord::Migration[7.1]
|
||||
class CreateProducts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :products, primary_key: [:store_id, :sku] do |t|
|
||||
t.integer :store_id
|
||||
|
|
|
@ -34,7 +34,7 @@ history to the latest version. Active Record will also update your
|
|||
Here's an example of a migration:
|
||||
|
||||
```ruby
|
||||
class CreateProducts < ActiveRecord::Migration[7.1]
|
||||
class CreateProducts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :products do |t|
|
||||
t.string :name
|
||||
|
@ -73,7 +73,7 @@ If you wish for a migration to do something that Active Record doesn't know how
|
|||
to reverse, you can use `reversible`:
|
||||
|
||||
```ruby
|
||||
class ChangeProductsPrice < ActiveRecord::Migration[7.1]
|
||||
class ChangeProductsPrice < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
reversible do |direction|
|
||||
change_table :products do |t|
|
||||
|
@ -92,7 +92,7 @@ passed to `direction.up` and `direction.down` respectively.
|
|||
Alternatively, you can use `up` and `down` instead of `change`:
|
||||
|
||||
```ruby
|
||||
class ChangeProductsPrice < ActiveRecord::Migration[7.1]
|
||||
class ChangeProductsPrice < ActiveRecord::Migration[7.2]
|
||||
def up
|
||||
change_table :products do |t|
|
||||
t.change :price, :string
|
||||
|
@ -136,7 +136,7 @@ $ bin/rails generate migration AddPartNumberToProducts
|
|||
This will create an appropriately named empty migration:
|
||||
|
||||
```ruby
|
||||
class AddPartNumberToProducts < ActiveRecord::Migration[7.1]
|
||||
class AddPartNumberToProducts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
end
|
||||
end
|
||||
|
@ -160,7 +160,7 @@ $ bin/rails generate migration AddPartNumberToProducts part_number:string
|
|||
This will generate the following migration:
|
||||
|
||||
```ruby
|
||||
class AddPartNumberToProducts < ActiveRecord::Migration[7.1]
|
||||
class AddPartNumberToProducts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
add_column :products, :part_number, :string
|
||||
end
|
||||
|
@ -176,7 +176,7 @@ $ bin/rails generate migration AddPartNumberToProducts part_number:string:index
|
|||
This will generate the appropriate [`add_column`][] and [`add_index`][] statements:
|
||||
|
||||
```ruby
|
||||
class AddPartNumberToProducts < ActiveRecord::Migration[7.1]
|
||||
class AddPartNumberToProducts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
add_column :products, :part_number, :string
|
||||
add_index :products, :part_number
|
||||
|
@ -194,7 +194,7 @@ Will generate a schema migration which adds two additional
|
|||
columns to the `products` table.
|
||||
|
||||
```ruby
|
||||
class AddDetailsToProducts < ActiveRecord::Migration[7.1]
|
||||
class AddDetailsToProducts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
add_column :products, :part_number, :string
|
||||
add_column :products, :price, :decimal
|
||||
|
@ -213,7 +213,7 @@ $ bin/rails generate migration RemovePartNumberFromProducts part_number:string
|
|||
This generates the appropriate [`remove_column`][] statements:
|
||||
|
||||
```ruby
|
||||
class RemovePartNumberFromProducts < ActiveRecord::Migration[7.1]
|
||||
class RemovePartNumberFromProducts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
remove_column :products, :part_number, :string
|
||||
end
|
||||
|
@ -233,7 +233,7 @@ $ bin/rails generate migration CreateProducts name:string part_number:string
|
|||
generates
|
||||
|
||||
```ruby
|
||||
class CreateProducts < ActiveRecord::Migration[7.1]
|
||||
class CreateProducts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :products do |t|
|
||||
t.string :name
|
||||
|
@ -261,7 +261,7 @@ $ bin/rails generate migration AddUserRefToProducts user:references
|
|||
generates the following [`add_reference`][] call:
|
||||
|
||||
```ruby
|
||||
class AddUserRefToProducts < ActiveRecord::Migration[7.1]
|
||||
class AddUserRefToProducts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
add_reference :products, :user, foreign_key: true
|
||||
end
|
||||
|
@ -281,7 +281,7 @@ $ bin/rails generate migration CreateJoinTableCustomerProduct customer product
|
|||
will produce the following migration:
|
||||
|
||||
```ruby
|
||||
class CreateJoinTableCustomerProduct < ActiveRecord::Migration[7.1]
|
||||
class CreateJoinTableCustomerProduct < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_join_table :customers, :products do |t|
|
||||
# t.index [:customer_id, :product_id]
|
||||
|
@ -310,7 +310,7 @@ $ bin/rails generate model Product name:string description:text
|
|||
This will create a migration that looks like this:
|
||||
|
||||
```ruby
|
||||
class CreateProducts < ActiveRecord::Migration[7.1]
|
||||
class CreateProducts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :products do |t|
|
||||
t.string :name
|
||||
|
@ -338,7 +338,7 @@ $ bin/rails generate migration AddDetailsToProducts 'price:decimal{5,2}' supplie
|
|||
will produce a migration that looks like this
|
||||
|
||||
```ruby
|
||||
class AddDetailsToProducts < ActiveRecord::Migration[7.1]
|
||||
class AddDetailsToProducts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
add_column :products, :price, :decimal, precision: 5, scale: 2
|
||||
add_reference :products, :supplier, polymorphic: true
|
||||
|
@ -635,7 +635,7 @@ You can create a table with a composite primary key by passing the
|
|||
`:primary_key` option to `create_table` with an array value:
|
||||
|
||||
```ruby
|
||||
class CreateProducts < ActiveRecord::Migration[7.1]
|
||||
class CreateProducts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :products, primary_key: [:customer_id, :product_sku] do |t|
|
||||
t.integer :customer_id
|
||||
|
@ -744,7 +744,7 @@ reverse. You can use [`reversible`][] to specify what to do when running a
|
|||
migration and what else to do when reverting it. For example:
|
||||
|
||||
```ruby
|
||||
class ExampleMigration < ActiveRecord::Migration[7.1]
|
||||
class ExampleMigration < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :distributors do |t|
|
||||
t.string :zipcode
|
||||
|
@ -795,7 +795,7 @@ reverse order they were made in the `up` method. The example in the `reversible`
|
|||
section is equivalent to:
|
||||
|
||||
```ruby
|
||||
class ExampleMigration < ActiveRecord::Migration[7.1]
|
||||
class ExampleMigration < ActiveRecord::Migration[7.2]
|
||||
def up
|
||||
create_table :distributors do |t|
|
||||
t.string :zipcode
|
||||
|
@ -843,7 +843,7 @@ You can use Active Record's ability to rollback migrations using the [`revert`][
|
|||
```ruby
|
||||
require_relative "20121212123456_example_migration"
|
||||
|
||||
class FixupExampleMigration < ActiveRecord::Migration[7.1]
|
||||
class FixupExampleMigration < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
revert ExampleMigration
|
||||
|
||||
|
@ -861,7 +861,7 @@ For example, let's imagine that `ExampleMigration` is committed and it is later
|
|||
decided that a Distributors view is no longer needed.
|
||||
|
||||
```ruby
|
||||
class DontUseDistributorsViewMigration < ActiveRecord::Migration[7.1]
|
||||
class DontUseDistributorsViewMigration < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
revert do
|
||||
# copy-pasted code from ExampleMigration
|
||||
|
@ -1039,7 +1039,7 @@ Several methods are provided in migrations that allow you to control all this:
|
|||
For example, take the following migration:
|
||||
|
||||
```ruby
|
||||
class CreateProducts < ActiveRecord::Migration[7.1]
|
||||
class CreateProducts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
suppress_messages do
|
||||
create_table :products do |t|
|
||||
|
@ -1144,7 +1144,7 @@ When `:ruby` is selected, then the schema is stored in `db/schema.rb`. If you lo
|
|||
at this file you'll find that it looks an awful lot like one very big migration:
|
||||
|
||||
```ruby
|
||||
ActiveRecord::Schema[7.1].define(version: 2008_09_06_171750) do
|
||||
ActiveRecord::Schema[7.2].define(version: 2008_09_06_171750) do
|
||||
create_table "authors", force: true do |t|
|
||||
t.string "name"
|
||||
t.datetime "created_at"
|
||||
|
@ -1229,7 +1229,7 @@ modify data. This is useful in an existing database that can't be destroyed and
|
|||
recreated, such as a production database.
|
||||
|
||||
```ruby
|
||||
class AddInitialProducts < ActiveRecord::Migration[7.1]
|
||||
class AddInitialProducts < ActiveRecord::Migration[7.2]
|
||||
def up
|
||||
5.times do |i|
|
||||
Product.create(name: "Product ##{i}", description: "A product.")
|
||||
|
|
|
@ -112,7 +112,7 @@ NOTE: `belongs_to` associations _must_ use the singular term. If you used the pl
|
|||
The corresponding migration might look like this:
|
||||
|
||||
```ruby
|
||||
class CreateBooks < ActiveRecord::Migration[7.1]
|
||||
class CreateBooks < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :authors do |t|
|
||||
t.string :name
|
||||
|
@ -159,7 +159,7 @@ The main difference from `belongs_to` is that the link column `supplier_id` is l
|
|||
The corresponding migration might look like this:
|
||||
|
||||
```ruby
|
||||
class CreateSuppliers < ActiveRecord::Migration[7.1]
|
||||
class CreateSuppliers < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :suppliers do |t|
|
||||
t.string :name
|
||||
|
@ -205,7 +205,7 @@ NOTE: The name of the other model is pluralized when declaring a `has_many` asso
|
|||
The corresponding migration might look like this:
|
||||
|
||||
```ruby
|
||||
class CreateAuthors < ActiveRecord::Migration[7.1]
|
||||
class CreateAuthors < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :authors do |t|
|
||||
t.string :name
|
||||
|
@ -257,7 +257,7 @@ end
|
|||
The corresponding migration might look like this:
|
||||
|
||||
```ruby
|
||||
class CreateAppointments < ActiveRecord::Migration[7.1]
|
||||
class CreateAppointments < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :physicians do |t|
|
||||
t.string :name
|
||||
|
@ -343,7 +343,7 @@ end
|
|||
The corresponding migration might look like this:
|
||||
|
||||
```ruby
|
||||
class CreateAccountHistories < ActiveRecord::Migration[7.1]
|
||||
class CreateAccountHistories < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :suppliers do |t|
|
||||
t.string :name
|
||||
|
@ -386,7 +386,7 @@ end
|
|||
The corresponding migration might look like this:
|
||||
|
||||
```ruby
|
||||
class CreateAssembliesAndParts < ActiveRecord::Migration[7.1]
|
||||
class CreateAssembliesAndParts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :assemblies do |t|
|
||||
t.string :name
|
||||
|
@ -425,7 +425,7 @@ end
|
|||
The corresponding migration might look like this:
|
||||
|
||||
```ruby
|
||||
class CreateSuppliers < ActiveRecord::Migration[7.1]
|
||||
class CreateSuppliers < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :suppliers do |t|
|
||||
t.string :name
|
||||
|
@ -510,7 +510,7 @@ Similarly, you can retrieve `@product.pictures`.
|
|||
If you have an instance of the `Picture` model, you can get to its parent via `@picture.imageable`. To make this work, you need to declare both a foreign key column and a type column in the model that declares the polymorphic interface:
|
||||
|
||||
```ruby
|
||||
class CreatePictures < ActiveRecord::Migration[7.1]
|
||||
class CreatePictures < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :pictures do |t|
|
||||
t.string :name
|
||||
|
@ -527,7 +527,7 @@ end
|
|||
This migration can be simplified by using the `t.references` form:
|
||||
|
||||
```ruby
|
||||
class CreatePictures < ActiveRecord::Migration[7.1]
|
||||
class CreatePictures < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :pictures do |t|
|
||||
t.string :name
|
||||
|
@ -622,7 +622,7 @@ With this setup, you can retrieve `@employee.subordinates` and `@employee.manage
|
|||
In your migrations/schema, you will add a references column to the model itself.
|
||||
|
||||
```ruby
|
||||
class CreateEmployees < ActiveRecord::Migration[7.1]
|
||||
class CreateEmployees < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :employees do |t|
|
||||
t.references :manager, foreign_key: { to_table: :employees }
|
||||
|
@ -696,7 +696,7 @@ end
|
|||
This declaration needs to be backed up by a corresponding foreign key column in the books table. For a brand new table, the migration might look something like this:
|
||||
|
||||
```ruby
|
||||
class CreateBooks < ActiveRecord::Migration[7.1]
|
||||
class CreateBooks < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :books do |t|
|
||||
t.datetime :published_at
|
||||
|
@ -710,7 +710,7 @@ end
|
|||
Whereas for an existing table, it might look like this:
|
||||
|
||||
```ruby
|
||||
class AddAuthorToBooks < ActiveRecord::Migration[7.1]
|
||||
class AddAuthorToBooks < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
add_reference :books, :author
|
||||
end
|
||||
|
@ -742,7 +742,7 @@ end
|
|||
These need to be backed up by a migration to create the `assemblies_parts` table. This table should be created without a primary key:
|
||||
|
||||
```ruby
|
||||
class CreateAssembliesPartsJoinTable < ActiveRecord::Migration[7.1]
|
||||
class CreateAssembliesPartsJoinTable < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :assemblies_parts, id: false do |t|
|
||||
t.bigint :assembly_id
|
||||
|
@ -760,7 +760,7 @@ We pass `id: false` to `create_table` because that table does not represent a mo
|
|||
For simplicity, you can also use the method `create_join_table`:
|
||||
|
||||
```ruby
|
||||
class CreateAssembliesPartsJoinTable < ActiveRecord::Migration[7.1]
|
||||
class CreateAssembliesPartsJoinTable < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_join_table :assemblies, :parts do |t|
|
||||
t.index :assembly_id
|
||||
|
|
|
@ -410,7 +410,7 @@ If you wish to test out some code without changing any data, you can do that by
|
|||
|
||||
```bash
|
||||
$ bin/rails console --sandbox
|
||||
Loading development environment in sandbox (Rails 7.1.0)
|
||||
Loading development environment in sandbox (Rails 7.2.0)
|
||||
Any modifications you make will be rolled back on exit
|
||||
irb(main):001:0>
|
||||
```
|
||||
|
|
|
@ -614,7 +614,7 @@ To ease the upgrade it's required to add the new default to the
|
|||
value:
|
||||
|
||||
```ruby
|
||||
# new_framework_defaults_7_1.rb.tt
|
||||
# new_framework_defaults_7_2.rb.tt
|
||||
|
||||
# Rails.application.config.active_job.existing_behavior = false
|
||||
```
|
||||
|
|
|
@ -378,7 +378,7 @@ Processing by PostsController#index as HTML
|
|||
10| # GET /posts/1 or /posts/1.json
|
||||
11| def show
|
||||
=>#0 PostsController#index at ~/projects/rails-guide-example/app/controllers/posts_controller.rb:7
|
||||
#1 ActionController::BasicImplicitRender#send_action(method="index", args=[]) at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actionpack-7.1.0.alpha/lib/action_controller/metal/basic_implicit_render.rb:6
|
||||
#1 ActionController::BasicImplicitRender#send_action(method="index", args=[]) at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actionpack-7.2.0.alpha/lib/action_controller/metal/basic_implicit_render.rb:6
|
||||
# and 72 frames (use `bt' command for all frames)
|
||||
(rdbg)
|
||||
```
|
||||
|
@ -444,14 +444,14 @@ When used without any options, `backtrace` lists all the frames on the stack:
|
|||
|
||||
```rb
|
||||
=>#0 PostsController#index at ~/projects/rails-guide-example/app/controllers/posts_controller.rb:7
|
||||
#1 ActionController::BasicImplicitRender#send_action(method="index", args=[]) at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actionpack-7.1.0.alpha/lib/action_controller/metal/basic_implicit_render.rb:6
|
||||
#2 AbstractController::Base#process_action(method_name="index", args=[]) at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actionpack-7.1.0.alpha/lib/abstract_controller/base.rb:214
|
||||
#3 ActionController::Rendering#process_action(#arg_rest=nil) at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actionpack-7.1.0.alpha/lib/action_controller/metal/rendering.rb:53
|
||||
#4 block in process_action at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actionpack-7.1.0.alpha/lib/abstract_controller/callbacks.rb:221
|
||||
#5 block in run_callbacks at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/activesupport-7.1.0.alpha/lib/active_support/callbacks.rb:118
|
||||
#6 ActionText::Rendering::ClassMethods#with_renderer(renderer=#<PostsController:0x0000000000af78>) at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actiontext-7.1.0.alpha/lib/action_text/rendering.rb:20
|
||||
#7 block {|controller=#<PostsController:0x0000000000af78>, action=#<Proc:0x00007fd91985f1c0 /Users/st0012/...|} in <class:Engine> (4 levels) at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actiontext-7.1.0.alpha/lib/action_text/engine.rb:69
|
||||
#8 [C] BasicObject#instance_exec at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/activesupport-7.1.0.alpha/lib/active_support/callbacks.rb:127
|
||||
#1 ActionController::BasicImplicitRender#send_action(method="index", args=[]) at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actionpack-2.0.alpha/lib/action_controller/metal/basic_implicit_render.rb:6
|
||||
#2 AbstractController::Base#process_action(method_name="index", args=[]) at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actionpack-7.2.0.alpha/lib/abstract_controller/base.rb:214
|
||||
#3 ActionController::Rendering#process_action(#arg_rest=nil) at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actionpack-7.2.0.alpha/lib/action_controller/metal/rendering.rb:53
|
||||
#4 block in process_action at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actionpack-7.2.0.alpha/lib/abstract_controller/callbacks.rb:221
|
||||
#5 block in run_callbacks at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/activesupport-7.2.0.alpha/lib/active_support/callbacks.rb:118
|
||||
#6 ActionText::Rendering::ClassMethods#with_renderer(renderer=#<PostsController:0x0000000000af78>) at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actiontext-7.2.0.alpha/lib/action_text/rendering.rb:20
|
||||
#7 block {|controller=#<PostsController:0x0000000000af78>, action=#<Proc:0x00007fd91985f1c0 /Users/st0012/...|} in <class:Engine> (4 levels) at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/actiontext-7.2.0.alpha/lib/action_text/engine.rb:69
|
||||
#8 [C] BasicObject#instance_exec at ~/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/activesupport-7.2.0.alpha/lib/active_support/callbacks.rb:127
|
||||
..... and more
|
||||
```
|
||||
|
||||
|
|
|
@ -331,6 +331,11 @@
|
|||
description: >
|
||||
This guide provides steps to be followed when you upgrade your
|
||||
applications to a newer version of Ruby on Rails.
|
||||
-
|
||||
name: Version 7.2 - ?
|
||||
url: 7_2_release_notes.html
|
||||
description: Release notes for Rails 7.1.
|
||||
work_in_progress: true
|
||||
-
|
||||
name: Version 7.1 - ?
|
||||
url: 7_1_release_notes.html
|
||||
|
|
|
@ -53,7 +53,7 @@ For unsupported series, bug fixes may coincidentally land in a stable branch,
|
|||
but won't be released in an official version. It is recommended to point your
|
||||
application at the stable branch using Git for unsupported versions.
|
||||
|
||||
**Currently included series:** `7.1.Z`.
|
||||
**Currently included series:** `7.2.Z`.
|
||||
|
||||
Security Issues
|
||||
---------------
|
||||
|
@ -78,7 +78,7 @@ there could be breaking changes in the security release. A security release
|
|||
should only contain the changes needed to ensure the app is secure so that it's
|
||||
easier for applications to remain upgraded.
|
||||
|
||||
**Currently included series:** `7.1.Z`, `7.0.Z`, `6.1.Z`.
|
||||
**Currently included series:** `7.2.Z`, `7.1.Z`.
|
||||
|
||||
Severe Security Issues
|
||||
----------------------
|
||||
|
@ -87,7 +87,7 @@ For severe security issues all releases in the current major series, and also th
|
|||
last release in the previous major series will receive patches and new versions. The
|
||||
classification of the security issue is judged by the core team.
|
||||
|
||||
**Currently included series:** `7.1.Z`, `7.0.Z`, `6.1.Z`.
|
||||
**Currently included series:** `7.2.Z`, `7.1.Z`, `7.0.Z`, `6.1.Z`.
|
||||
|
||||
Unsupported Release Series
|
||||
--------------------------
|
||||
|
|
|
@ -63,7 +63,7 @@ $ bin/rails app:update
|
|||
conflict config/application.rb
|
||||
Overwrite /myapp/config/application.rb? (enter "h" for help) [Ynaqdh]
|
||||
force config/application.rb
|
||||
create config/initializers/new_framework_defaults_7_0.rb
|
||||
create config/initializers/new_framework_defaults_7_2.rb
|
||||
...
|
||||
```
|
||||
|
||||
|
@ -75,6 +75,11 @@ The new Rails version might have different configuration defaults than the previ
|
|||
|
||||
To allow you to upgrade to new defaults one by one, the update task has created a file `config/initializers/new_framework_defaults_X.Y.rb` (with the desired Rails version in the filename). You should enable the new configuration defaults by uncommenting them in the file; this can be done gradually over several deployments. Once your application is ready to run with new defaults, you can remove this file and flip the `config.load_defaults` value.
|
||||
|
||||
Upgrading from Rails 7.1 to Rails 7.2
|
||||
-------------------------------------
|
||||
|
||||
For more information on changes made to Rails 7.2 please see the [release notes](7_2_release_notes.html).
|
||||
|
||||
Upgrading from Rails 7.0 to Rails 7.1
|
||||
-------------------------------------
|
||||
|
||||
|
|
|
@ -1,816 +1,2 @@
|
|||
## Rails 7.1.0.rc1 (September 27, 2023) ##
|
||||
|
||||
* Require `concurrent-ruby` in `config/puma.rb` so that Puma can boot in
|
||||
production when `WEB_CONCURRENCY` is not explicitly specified.
|
||||
|
||||
Fixes #49323.
|
||||
|
||||
*Matt Brictson*
|
||||
|
||||
* Raise error when generating attribute with dangerous name.
|
||||
|
||||
The following will now raise an error as `save` and `hash` are already
|
||||
defined by Active Record.
|
||||
|
||||
```bash
|
||||
$ bin/rails generate model Post save
|
||||
$ bin/rails generate model Post hash
|
||||
```
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
|
||||
## Rails 7.1.0.beta1 (September 13, 2023) ##
|
||||
|
||||
* Add ability to show slow tests to the test runner
|
||||
|
||||
```bash
|
||||
$ bin/test --profile # additionally prints 10 (default) slowest tests
|
||||
# or
|
||||
$ bin/test --profile 20 # prints 20 slowest tests
|
||||
```
|
||||
|
||||
*fatkodima*
|
||||
|
||||
* `rails new --javascript` generator now supports Bun
|
||||
|
||||
```bash
|
||||
$ rails new my_new_app --javascript=bun
|
||||
```
|
||||
|
||||
*Jason Meller*
|
||||
|
||||
* bin/setup uses `bun` instead of `yarn` when generated an app with bun
|
||||
|
||||
Use `bun install` on `bin/setup` when using `bun`.
|
||||
|
||||
*Cadu Ribeiro*
|
||||
|
||||
* `config/application.rb` now includes
|
||||
|
||||
```ruby
|
||||
config.autoload_lib(ignore: %w(assets tasks))
|
||||
```
|
||||
|
||||
In practice, this means that new 7.1 applications autoload from `lib` out of the box.
|
||||
|
||||
*Xavier Noria*
|
||||
|
||||
* Add an option to start rails console in sandbox mode by default
|
||||
|
||||
`sandbox_by_default` option is added to start rails console in sandbox
|
||||
mode by default. With this option turned on, `--no-sandbox` must be
|
||||
specified to start rails in non-sandbox mode.
|
||||
|
||||
Note that this option is ignored when rails environment is development
|
||||
or test.
|
||||
|
||||
*Shouichi Kamiya*
|
||||
|
||||
* Omit `webdrivers` gem dependency from `Gemfile` template
|
||||
|
||||
*Sean Doyle*
|
||||
|
||||
* Support filtering tests by line ranges
|
||||
|
||||
The new syntax allows you to filter tests by line ranges. For example, the
|
||||
following command runs tests from line 10 to 20.
|
||||
|
||||
```bash
|
||||
$ rails test test/models/user_test.rb:10-20
|
||||
```
|
||||
|
||||
*Shouichi Kamiya*, *Seonggi Yang*, *oljfte*, *Ryohei UEDA*
|
||||
|
||||
* Update default scaffold templates to set 303 (See Other) as status code
|
||||
on redirect for the update action for XHR requests other than GET or POST
|
||||
to avoid issues (e.g browsers trying to follow the redirect using the
|
||||
original request method resulting in double PATCH/PUT)
|
||||
|
||||
*Guillermo Iguaran*
|
||||
|
||||
* The new `config.autoload_lib_once` is similar to `config.autoload_lib`,
|
||||
except that it adds `lib` to `config.autoload_once_paths` instead.
|
||||
|
||||
By calling `config.autoload_lib_once`, classes and modules in `lib` can be
|
||||
autoloaded, even from application initializers, but won't be reloaded.
|
||||
|
||||
Please, see further details in the [autoloading
|
||||
guide](https://guides.rubyonrails.org/v7.1/autoloading_and_reloading_constants.html).
|
||||
|
||||
*Xavier Noria*
|
||||
|
||||
* Add `config.action_dispatch.debug_exception_log_level` to configure the log
|
||||
level used by `ActionDispatch::DebugExceptions`.
|
||||
|
||||
The default is `:fatal`, but with `load_defaults "7.1"` the default will be
|
||||
`:error`.
|
||||
|
||||
*Hartley McGuire*
|
||||
|
||||
* Add `DATABASE` option to `railties:install:migrations`
|
||||
|
||||
This allows you to specify which database the migrations should be copied to
|
||||
when running `rails railties:install:migrations`.
|
||||
|
||||
```bash
|
||||
$ rails railties:install:migrations DATABASE=animals
|
||||
```
|
||||
|
||||
*Matthew Hirst*
|
||||
|
||||
* The new method `config.autoload_lib(ignore:)` provides a simple way to
|
||||
autoload from `lib`:
|
||||
|
||||
```ruby
|
||||
# config/application.rb
|
||||
config.autoload_lib(ignore: %w(assets tasks))
|
||||
```
|
||||
|
||||
Please, see further details in the [autoloading
|
||||
guide](https://guides.rubyonrails.org/v7.1/autoloading_and_reloading_constants.html).
|
||||
|
||||
*Xavier Noria*
|
||||
|
||||
* Don't show secret_key_base for `Rails.application.config#inspect`.
|
||||
|
||||
Before:
|
||||
|
||||
```ruby
|
||||
Rails.application.config.inspect
|
||||
"#<Rails::Application::Configuration:0x00000001132b02a0 @root=... @secret_key_base=\"b3c631c314c0bbca50c1b2843150fe33\" ... >"
|
||||
```
|
||||
|
||||
After:
|
||||
|
||||
```ruby
|
||||
Rails.application.config.inspect
|
||||
"#<Rails::Application::Configuration:0x00000001132b02a0>"
|
||||
```
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
* Deprecate calling `Rails.application.secrets`.
|
||||
|
||||
Rails `secrets` have been deprecated in favor of `credentials`.
|
||||
Calling `Rails.application.secrets` should show a deprecation warning.
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
* Store `secret_key_base` in `Rails.config` for local environments.
|
||||
|
||||
Rails `secrets` have been deprecated in favor of `credentials`.
|
||||
For the local environments the `secret_key_base` is now stored in
|
||||
`Rails.config.secret_key_base` instead of the soft deprecated
|
||||
`Rails.application.secrets.secret_key_base`.
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
* Enable force_ssl=true in production by default: Force all access to the app over SSL,
|
||||
use Strict-Transport-Security, and use secure cookies
|
||||
|
||||
*Justin Searls*, *Aaron Patterson*, *Guillermo Iguaran*, *Vinícius Bispo*
|
||||
|
||||
* Add engine's draw paths to application route set, so that the application
|
||||
can draw route files defined in engine paths.
|
||||
|
||||
*Gannon McGibbon*
|
||||
|
||||
* Support `VISUAL` environment variable for commands which open an editor,
|
||||
and prefer it over `EDITOR`.
|
||||
|
||||
*Summer ☀️*
|
||||
|
||||
* Add engine's `test/fixtures` path to `fixture_paths` in `on_load` hook if
|
||||
path exists and is under the Rails application root.
|
||||
|
||||
*Chris Salzberg*
|
||||
|
||||
* `bin/rails app:template` now runs `bundle install` and any `after_bundle`
|
||||
blocks after the template is executed.
|
||||
|
||||
*Jonathan Hefner* and *Gerry Caulfield*
|
||||
|
||||
* Enable passing column size to migration generator
|
||||
|
||||
Previously you could pass a limit to the migration generator:
|
||||
|
||||
`rails generate migration CreateAuthor name:text{65535}`
|
||||
|
||||
Now, a size attribute can be passed to the migration generator:
|
||||
|
||||
`rails generate migration CreateAuthor name:text{medium}`
|
||||
|
||||
This generates a migration which includes the size attribute:
|
||||
|
||||
```ruby
|
||||
class CreateAuthor < ActiveRecord::Migration[7.1]
|
||||
def change
|
||||
create_table :authors do |t|
|
||||
t.text :name, size: :medium
|
||||
end
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
*Josh Broughton*, *Hartley McGuire*
|
||||
|
||||
* Trying to set a config key with the same name of a method now raises:
|
||||
|
||||
```ruby
|
||||
config.load_defaults = 7.0
|
||||
# NoMethodError: Cannot assign to `load_defaults`, it is a configuration method
|
||||
```
|
||||
|
||||
*Xavier Noria*
|
||||
|
||||
* Deprecate `secrets:edit/show` and remove `secrets:setup`
|
||||
|
||||
`bin/rails secrets:setup` has been deprecated since Rails 5.2 in favor of
|
||||
credentials. This command has been removed.
|
||||
|
||||
`bin/rails secrets:show` and `bin/rails secrets:edit` have been deprecated
|
||||
in favor of credentials.
|
||||
|
||||
Run `bin/rails credentials:help` for more information
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
* `bin/rails --help` will now list only framework and plugin commands. Rake
|
||||
tasks defined in `lib/tasks/*.rake` files will no longer be included. For a
|
||||
list of those tasks, use `rake -T`.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Allow calling `bin/rails restart` outside of app directory.
|
||||
|
||||
The following would previously fail with a "No Rakefile found" error.
|
||||
|
||||
```bash
|
||||
$ blog/bin/rails restart
|
||||
```
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
* Support prerelease rubies in Gemfile template if RubyGems version is 3.3.13 or higher.
|
||||
|
||||
*Yasuo Honda*, *David Rodríguez*
|
||||
|
||||
* Autoloading setup honors root directories manually set by the user.
|
||||
|
||||
This is relevant for custom namespaces. For example, if you'd like classes
|
||||
and modules under `app/services` to be defined in the `Services` namespace
|
||||
without an extra `app/services/services` directory, this is now enough:
|
||||
|
||||
```ruby
|
||||
# config/initializers/autoloading.rb
|
||||
|
||||
# The namespace has to exist.
|
||||
#
|
||||
# In this example we define the module on the spot. Could also be created
|
||||
# elsewhere and its definition loaded here with an ordinary `require`. In
|
||||
# any case, `push_dir` expects a class or module object.
|
||||
module Services; end
|
||||
|
||||
Rails.autoloaders.main.push_dir("#{Rails.root}/app/services", namespace: Services)
|
||||
```
|
||||
|
||||
Check the autoloading guide for further details.
|
||||
|
||||
*Xavier Noria*
|
||||
|
||||
* Railties now requires the irb gem as a dependency, which means when you install Rails, irb will also
|
||||
be installed as a gem. Rails will then use the installed version of irb for its console instead of
|
||||
relying on Ruby's built-in version.
|
||||
This ensures that Rails has access to the most up-to-date and reliable version of irb for its console.
|
||||
|
||||
*Stan Lo*
|
||||
|
||||
* Use infinitive form for all rails command descriptions verbs.
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
* Credentials commands (e.g. `bin/rails credentials:edit`) now respect
|
||||
`config.credentials.content_path` and `config.credentials.key_path` when set
|
||||
in `config/application.rb` or `config/environments/#{Rails.env}.rb`.
|
||||
|
||||
Before:
|
||||
|
||||
* `bin/rails credentials:edit` ignored `RAILS_ENV`, and would always edit
|
||||
`config/credentials.yml.enc`.
|
||||
|
||||
* `bin/rails credentials:edit --environment foo` would create and edit
|
||||
`config/credentials/foo.yml.enc`.
|
||||
|
||||
* If `config.credentials.content_path` or `config.credentials.key_path`
|
||||
was set, `bin/rails credentials:edit` could not be used to edit the
|
||||
credentials. Editing credentials required using `bin/rails
|
||||
encrypted:edit path/to/credentials --key path/to/key`.
|
||||
|
||||
After:
|
||||
|
||||
* `bin/rails credentials:edit` will edit the credentials file that the app
|
||||
would load for the current `RAILS_ENV`.
|
||||
|
||||
* `bin/rails credentials:edit` respects `config.credentials.content_path`
|
||||
and `config.credentials.key_path` when set in `config/application.rb`
|
||||
or `config/environments/#{Rails.env}.rb`.
|
||||
|
||||
* `bin/rails credentials:edit --environment foo` will create and edit
|
||||
`config/credentials/foo.yml.enc` _if_ `config.credentials.content_path`
|
||||
has not been set for the `foo` environment. Ultimately, it will edit
|
||||
the credentials file that the app would load for the `foo` environment.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Add descriptions for non-Rake commands when running `rails -h`.
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
* Show relevant commands when calling help
|
||||
|
||||
When running `rails -h` or just `rails` outside a Rails application,
|
||||
Rails outputs all options for running the `rails new` command. This can be
|
||||
confusing to users when they probably want to see the common Rails commands.
|
||||
|
||||
Instead, we should always show the common commands when running `rails -h`
|
||||
inside or outside a Rails application.
|
||||
|
||||
As the relevant commands inside a Rails application differ from the
|
||||
commands outside an application, the help USAGE file has been split to
|
||||
show the most relevant commands for the context.
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
* Add Rails::HealthController#show and map it to /up for newly generated applications.
|
||||
Load balancers and uptime monitors all need a basic endpoint to tell whether the app is up.
|
||||
This is a good starting point that'll work in many situations.
|
||||
|
||||
*DHH*
|
||||
|
||||
* Only use HostAuthorization middleware if `config.hosts` is not empty
|
||||
|
||||
*Hartley McGuire*
|
||||
|
||||
* Raise an exception when a `before_action`'s "only" or "except" filter
|
||||
options reference an action that doesn't exist. This will be enabled by
|
||||
default but can be overridden via config.
|
||||
|
||||
```ruby
|
||||
# config/environments/production.rb
|
||||
config.action_controller.raise_on_missing_callback_actions = false
|
||||
```
|
||||
|
||||
*Jess Bees*
|
||||
|
||||
* Use physical processor count as the default Puma worker count in production.
|
||||
This can be overridden by setting `ENV["WEB_CONCURRENCY"]` or editing the
|
||||
generated "config/puma.rb" directly.
|
||||
|
||||
*DHH*
|
||||
|
||||
* Add Docker files by default to new apps: Dockerfile, .dockerignore, bin/docker-entrypoint.
|
||||
These files can be skipped with `--skip-docker`. They're intended as a starting point for
|
||||
a production deploy of the application. Not intended for development (see Docked Rails for that).
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
$ docker build -t app .
|
||||
$ docker volume create app-storage
|
||||
$ docker run --rm -it -v app-storage:/rails/storage -p 3000:3000 --env RAILS_MASTER_KEY=<see config/master.key> app
|
||||
```
|
||||
|
||||
You can also start a console or a runner from this image:
|
||||
|
||||
```bash
|
||||
$ docker run --rm -it -v app-storage:/rails/storage --env RAILS_MASTER_KEY=<see config/master.key> app console
|
||||
```
|
||||
|
||||
To create a multi-platform image on Apple Silicon to deploy on AMD or Intel and push to Docker Hub for user/app:
|
||||
|
||||
```bash
|
||||
$ docker login -u <user>
|
||||
$ docker buildx create --use
|
||||
$ docker buildx build --push --platform=linux/amd64,linux/arm64 -t <user/image> .
|
||||
```
|
||||
|
||||
*DHH, Sam Ruby*
|
||||
|
||||
* Add ENV["SECRET_KEY_BASE_DUMMY"] for starting production environment with a generated secret base key,
|
||||
which can be used to run tasks like `assets:precompile` without making the RAILS_MASTER_KEY available
|
||||
to the build process.
|
||||
|
||||
Dockerfile layer example:
|
||||
|
||||
```
|
||||
RUN SECRET_KEY_BASE_DUMMY=1 bundle exec rails assets:precompile
|
||||
```
|
||||
|
||||
*DHH*
|
||||
|
||||
* Show descriptions for all commands in Rails help
|
||||
|
||||
When calling `rails help` most commands missed their description. We now
|
||||
show the same descriptions as shown in `rails -T`.
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
* Always generate the storage/ directory with rails new to ensure there's a stable place to
|
||||
put permanent files, and a single mount point for containers to map. Then default sqlite3 databases
|
||||
to live there instead of db/, which is only meant for configuration, not data.
|
||||
|
||||
*DHH*
|
||||
|
||||
* Rails console now disables `IRB`'s autocompletion feature in production by default.
|
||||
|
||||
Setting `IRB_USE_AUTOCOMPLETE=true` can override this default.
|
||||
|
||||
*Stan Lo*
|
||||
|
||||
* Add `config.precompile_filter_parameters`, which enables precompilation of
|
||||
`config.filter_parameters` using `ActiveSupport::ParameterFilter.precompile_filters`.
|
||||
Precompilation can improve filtering performance, depending on the quantity
|
||||
and types of filters.
|
||||
|
||||
`config.precompile_filter_parameters` defaults to `true` for
|
||||
`config.load_defaults 7.1` and above.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Add `after_routes_loaded` hook to `Rails::Railtie::Configuration` for
|
||||
engines to add a hook to be called after application routes have been
|
||||
loaded.
|
||||
|
||||
```ruby
|
||||
MyEngine.config.after_routes_loaded do
|
||||
# code that must happen after routes have been loaded
|
||||
end
|
||||
```
|
||||
|
||||
*Chris Salzberg*
|
||||
|
||||
* Send 303 See Other status code back for the destroy action on newly generated
|
||||
scaffold controllers.
|
||||
|
||||
*Tony Drake*
|
||||
|
||||
* Add `Rails.application.deprecators` as a central point to manage deprecators
|
||||
for an application.
|
||||
|
||||
Individual deprecators can be added and retrieved from the collection:
|
||||
|
||||
```ruby
|
||||
Rails.application.deprecators[:my_gem] = ActiveSupport::Deprecation.new("2.0", "MyGem")
|
||||
Rails.application.deprecators[:other_gem] = ActiveSupport::Deprecation.new("3.0", "OtherGem")
|
||||
```
|
||||
|
||||
And the collection's configuration methods affect all deprecators in the
|
||||
collection:
|
||||
|
||||
```ruby
|
||||
Rails.application.deprecators.debug = true
|
||||
|
||||
Rails.application.deprecators[:my_gem].debug
|
||||
# => true
|
||||
Rails.application.deprecators[:other_gem].debug
|
||||
# => true
|
||||
```
|
||||
|
||||
Additionally, all deprecators in the collection can be silenced for the
|
||||
duration of a given block:
|
||||
|
||||
```ruby
|
||||
Rails.application.deprecators.silence do
|
||||
Rails.application.deprecators[:my_gem].warn # => silenced (no warning)
|
||||
Rails.application.deprecators[:other_gem].warn # => silenced (no warning)
|
||||
end
|
||||
```
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Move dbconsole logic to Active Record connection adapter.
|
||||
|
||||
Instead of hosting the connection logic in the command object, the
|
||||
database adapter should be responsible for connecting to a console session.
|
||||
This patch moves #find_cmd_and_exec to the adapter and exposes a new API to
|
||||
lookup the adapter class without instantiating it.
|
||||
|
||||
*Gannon McGibbon*, *Paarth Madan*
|
||||
|
||||
* Add `Rails.application.message_verifiers` as a central point to configure
|
||||
and create message verifiers for an application.
|
||||
|
||||
This allows applications to, for example, rotate old `secret_key_base`
|
||||
values:
|
||||
|
||||
```ruby
|
||||
config.before_initialize do |app|
|
||||
app.message_verifiers.rotate(secret_key_base: "old secret_key_base")
|
||||
end
|
||||
```
|
||||
|
||||
And for libraries to create preconfigured message verifiers:
|
||||
|
||||
```ruby
|
||||
ActiveStorage.verifier = Rails.application.message_verifiers["ActiveStorage"]
|
||||
```
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Support MySQL's ssl-mode option for the dbconsole command.
|
||||
|
||||
Verifying the identity of the database server requires setting the ssl-mode
|
||||
option to VERIFY_CA or VERIFY_IDENTITY. This option was previously ignored
|
||||
for the dbconsole command.
|
||||
|
||||
*Petrik de Heus*
|
||||
|
||||
* Delegate application record generator description to orm hooked generator.
|
||||
|
||||
*Gannon McGibbon*
|
||||
|
||||
* Show BCC recipients when present in Action Mailer previews.
|
||||
|
||||
*Akshay Birajdar*
|
||||
|
||||
* Extend `routes --grep` to also filter routes by matching against path.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
$ bin/rails routes --grep /cats/1
|
||||
Prefix Verb URI Pattern Controller#Action
|
||||
cat GET /cats/:id(.:format) cats#show
|
||||
PATCH /cats/:id(.:format) cats#update
|
||||
PUT /cats/:id(.:format) cats#update
|
||||
DELETE /cats/:id(.:format) cats#destroy
|
||||
```
|
||||
|
||||
*Orhan Toy*
|
||||
|
||||
* Improve `rails runner` output when given a file path that doesn't exist.
|
||||
|
||||
*Tekin Suleyman*
|
||||
|
||||
* `config.allow_concurrency = false` now use a `Monitor` instead of a `Mutex`
|
||||
|
||||
This allows to enable `config.active_support.executor_around_test_case` even
|
||||
when `config.allow_concurrency` is disabled.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Add `routes --unused` option to detect extraneous routes.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
$ bin/rails routes --unused
|
||||
|
||||
Found 2 unused routes:
|
||||
|
||||
Prefix Verb URI Pattern Controller#Action
|
||||
one GET /one(.:format) action#one
|
||||
two GET /two(.:format) action#two
|
||||
```
|
||||
|
||||
*Gannon McGibbon*
|
||||
|
||||
* Add `--parent` option to controller generator to specify parent class of job.
|
||||
|
||||
Example:
|
||||
|
||||
`bin/rails g controller admin/users --parent=admin_controller` generates:
|
||||
|
||||
```ruby
|
||||
class Admin::UsersController < AdminController
|
||||
# ...
|
||||
end
|
||||
```
|
||||
|
||||
*Gannon McGibbon*
|
||||
|
||||
* In-app custom credentials templates are now supported. When a credentials
|
||||
file does not exist, `rails credentials:edit` will now try to use
|
||||
`lib/templates/rails/credentials/credentials.yml.tt` to generate the
|
||||
credentials file, before falling back to the default template.
|
||||
|
||||
This allows e.g. an open-source Rails app (which would not include encrypted
|
||||
credentials files in its repo) to include a credentials template, so that
|
||||
users who install the app will get a custom pre-filled credentials file when
|
||||
they run `rails credentials:edit`.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Except for `dev` and `test` environments, newly generated per-environment
|
||||
credentials files (e.g. `config/credentials/production.yml.enc`) now include
|
||||
a `secret_key_base` for convenience, just as `config/credentials.yml.enc`
|
||||
does.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* `--no-*` options now work with the app generator's `--minimal` option, and
|
||||
are both comprehensive and precise. For example:
|
||||
|
||||
```bash
|
||||
$ rails new my_cool_app --minimal
|
||||
Based on the specified options, the following options will also be activated:
|
||||
|
||||
--skip-active-job [due to --minimal]
|
||||
--skip-action-mailer [due to --skip-active-job, --minimal]
|
||||
--skip-active-storage [due to --skip-active-job, --minimal]
|
||||
--skip-action-mailbox [due to --skip-active-storage, --minimal]
|
||||
--skip-action-text [due to --skip-active-storage, --minimal]
|
||||
--skip-javascript [due to --minimal]
|
||||
--skip-hotwire [due to --skip-javascript, --minimal]
|
||||
--skip-action-cable [due to --minimal]
|
||||
--skip-bootsnap [due to --minimal]
|
||||
--skip-dev-gems [due to --minimal]
|
||||
--skip-system-test [due to --minimal]
|
||||
|
||||
...
|
||||
|
||||
$ rails new my_cool_app --minimal --no-skip-active-storage
|
||||
Based on the specified options, the following options will also be activated:
|
||||
|
||||
--skip-action-mailer [due to --minimal]
|
||||
--skip-action-mailbox [due to --minimal]
|
||||
--skip-action-text [due to --minimal]
|
||||
--skip-javascript [due to --minimal]
|
||||
--skip-hotwire [due to --skip-javascript, --minimal]
|
||||
--skip-action-cable [due to --minimal]
|
||||
--skip-bootsnap [due to --minimal]
|
||||
--skip-dev-gems [due to --minimal]
|
||||
--skip-system-test [due to --minimal]
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
*Brad Trick* and *Jonathan Hefner*
|
||||
|
||||
* Add `--skip-dev-gems` option to app generator to skip adding development
|
||||
gems (like `web-console`) to the Gemfile.
|
||||
|
||||
*Brad Trick*
|
||||
|
||||
* Skip Active Storage and Action Mailer if Active Job is skipped.
|
||||
|
||||
*Étienne Barrié*
|
||||
|
||||
* Correctly check if frameworks are disabled when running app:update.
|
||||
|
||||
*Étienne Barrié* and *Paulo Barros*
|
||||
|
||||
* Delegate model generator description to orm hooked generator.
|
||||
|
||||
*Gannon McGibbon*
|
||||
|
||||
* Execute `rails runner` scripts inside the executor.
|
||||
|
||||
Enables error reporting, query cache, etc.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Avoid booting in development then test for test tasks.
|
||||
|
||||
Running one of the rails test subtasks (e.g. test:system, test:models) would
|
||||
go through Rake and cause the app to be booted twice. Now all the test:*
|
||||
subtasks are defined as Thor tasks and directly load the test environment.
|
||||
|
||||
*Étienne Barrié*
|
||||
|
||||
* Deprecate `Rails::Generators::Testing::Behaviour` in favor of `Rails::Generators::Testing::Behavior`.
|
||||
|
||||
*Gannon McGibbon*
|
||||
|
||||
* Allow configuration of logger size for local and test environments
|
||||
|
||||
`config.log_file_size`
|
||||
|
||||
Defaults to `100` megabytes.
|
||||
|
||||
*Bernie Chiu*
|
||||
|
||||
* Enroll new apps in decrypted diffs of credentials by default. This behavior
|
||||
can be opted out of with the app generator's `--skip-decrypted-diffs` flag.
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Support declarative-style test name filters with `bin/rails test`.
|
||||
|
||||
This makes it possible to run a declarative-style test such as:
|
||||
|
||||
```ruby
|
||||
class MyTest < ActiveSupport::TestCase
|
||||
test "does something" do
|
||||
# ...
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
Using its declared name:
|
||||
|
||||
```bash
|
||||
$ bin/rails test test/my_test.rb -n "does something"
|
||||
```
|
||||
|
||||
Instead of having to specify its expanded method name:
|
||||
|
||||
```bash
|
||||
$ bin/rails test test/my_test.rb -n test_does_something
|
||||
```
|
||||
|
||||
*Jonathan Hefner*
|
||||
|
||||
* Add `--js` and `--skip-javascript` options to `rails new`
|
||||
|
||||
`--js` alias to `rails new --javascript ...`
|
||||
|
||||
Same as `-j`, e.g. `rails new --js esbuild ...`
|
||||
|
||||
`--skip-js` alias to `rails new --skip-javascript ...`
|
||||
|
||||
Same as `-J`, e.g. `rails new --skip-js ...`
|
||||
|
||||
*Dorian Marié*
|
||||
|
||||
* Allow relative paths with leading dot slash to be passed to `rails test`.
|
||||
|
||||
Fix `rails test ./test/model/post_test.rb` to run a single test file.
|
||||
|
||||
*Shouichi Kamiya* and *oljfte*
|
||||
|
||||
* Deprecate `config.enable_dependency_loading`. This flag addressed a limitation of the `classic` autoloader and has no effect nowadays. To fix this deprecation, please just delete the reference.
|
||||
|
||||
*Xavier Noria*
|
||||
|
||||
* Define `config.enable_reloading` to be `!config.cache_classes` for a more intuitive name. While `config.enable_reloading` and `config.reloading_enabled?` are preferred from now on, `config.cache_classes` is supported for backwards compatibility.
|
||||
|
||||
*Xavier Noria*
|
||||
|
||||
* Add JavaScript dependencies installation on bin/setup
|
||||
|
||||
Add `yarn install` to bin/setup when using esbuild, webpack, or rollout.
|
||||
|
||||
*Carlos Ribeiro*
|
||||
|
||||
* Use `controller_class_path` in `Rails::Generators::NamedBase#route_url`
|
||||
|
||||
The `route_url` method now returns the correct path when generating
|
||||
a namespaced controller with a top-level model using `--model-name`.
|
||||
|
||||
Previously, when running this command:
|
||||
|
||||
```bash
|
||||
$ bin/rails generate scaffold_controller Admin/Post --model-name Post
|
||||
```
|
||||
|
||||
the comments above the controller action would look like:
|
||||
|
||||
``` ruby
|
||||
# GET /posts
|
||||
def index
|
||||
@posts = Post.all
|
||||
end
|
||||
```
|
||||
|
||||
afterwards, they now look like this:
|
||||
|
||||
``` ruby
|
||||
# GET /admin/posts
|
||||
def index
|
||||
@posts = Post.all
|
||||
end
|
||||
```
|
||||
|
||||
Fixes #44662.
|
||||
|
||||
*Andrew White*
|
||||
|
||||
* No longer add autoloaded paths to `$LOAD_PATH`.
|
||||
|
||||
This means it won't be possible to load them with a manual `require` call, the class or module can be referenced instead.
|
||||
|
||||
Reducing the size of `$LOAD_PATH` speed-up `require` calls for apps not using `bootsnap`, and reduce the
|
||||
size of the `bootsnap` cache for the others.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Remove default `X-Download-Options` header
|
||||
|
||||
This header is currently only used by Internet Explorer which
|
||||
will be discontinued in 2022 and since Rails 7 does not fully
|
||||
support Internet Explorer this header should not be a default one.
|
||||
|
||||
*Harun Sabljaković*
|
||||
|
||||
* Add .node-version files for Rails apps that use Node.js
|
||||
|
||||
Node version managers that make use of this file:
|
||||
https://github.com/shadowspawn/node-version-usage#node-version-file-usage
|
||||
|
||||
The generated Dockerfile will use the same node version.
|
||||
|
||||
*Sam Ruby*
|
||||
|
||||
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/railties/CHANGELOG.md) for previous changes.
|
||||
Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/railties/CHANGELOG.md) for previous changes.
|
||||
|
|
|
@ -329,6 +329,8 @@ module Rails
|
|||
action_text.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor
|
||||
end
|
||||
end
|
||||
when "7.2"
|
||||
load_defaults "7.1"
|
||||
else
|
||||
raise "Unknown version #{target_version.to_s.inspect}"
|
||||
end
|
||||
|
|
|
@ -8,9 +8,9 @@ module Rails
|
|||
|
||||
module VERSION
|
||||
MAJOR = 7
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
TINY = 0
|
||||
PRE = "rc1"
|
||||
PRE = "alpha"
|
||||
|
||||
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
||||
end
|
||||
|
|
|
@ -1,223 +0,0 @@
|
|||
# Be sure to restart your server when you modify this file.
|
||||
#
|
||||
# This file eases your Rails 7.1 framework defaults upgrade.
|
||||
#
|
||||
# Uncomment each configuration one by one to switch to the new default.
|
||||
# Once your application is ready to run with all new defaults, you can remove
|
||||
# this file and set the `config.load_defaults` to `7.1`.
|
||||
#
|
||||
# Read the Guide for Upgrading Ruby on Rails for more info on each option.
|
||||
# https://guides.rubyonrails.org/upgrading_ruby_on_rails.html
|
||||
|
||||
# No longer add autoloaded paths into `$LOAD_PATH`. This means that you won't be able
|
||||
# to manually require files that are managed by the autoloader, which you shouldn't do anyway.
|
||||
# This will reduce the size of the load path, making `require` faster if you don't use bootsnap, or reduce the size
|
||||
# of the bootsnap cache if you use it.
|
||||
# Rails.application.config.add_autoload_paths_to_load_path = false
|
||||
|
||||
# Remove the default X-Download-Options headers since it is used only by Internet Explorer.
|
||||
# If you need to support Internet Explorer, add back `"X-Download-Options" => "noopen"`.
|
||||
# Rails.application.config.action_dispatch.default_headers = {
|
||||
# "X-Frame-Options" => "SAMEORIGIN",
|
||||
# "X-XSS-Protection" => "0",
|
||||
# "X-Content-Type-Options" => "nosniff",
|
||||
# "X-Permitted-Cross-Domain-Policies" => "none",
|
||||
# "Referrer-Policy" => "strict-origin-when-cross-origin"
|
||||
# }
|
||||
|
||||
# Do not treat an `ActionController::Parameters` instance
|
||||
# as equal to an equivalent `Hash` by default.
|
||||
# Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality = false
|
||||
|
||||
# Active Record Encryption now uses SHA-256 as its hash digest algorithm. Important: If you have
|
||||
# data encrypted with previous Rails versions, there are two scenarios to consider:
|
||||
#
|
||||
# 1. If you have +config.active_support.key_generator_hash_digest_class+ configured as SHA1 (the default
|
||||
# before Rails 7.0), you need to configure SHA-1 for Active Record Encryption too:
|
||||
# Rails.application.config.active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA1
|
||||
# 2. If you have +config.active_support.key_generator_hash_digest_class+ configured as SHA256 (the new default
|
||||
# in 7.0), then you need to configure SHA-256 for Active Record Encryption:
|
||||
# Rails.application.config.active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA256
|
||||
#
|
||||
# If you don't currently have data encrypted with Active Record encryption, you can disable this setting to
|
||||
# configure the default behavior starting 7.1+:
|
||||
# Rails.application.config.active_record.encryption.support_sha1_for_non_deterministic_encryption = false
|
||||
|
||||
# No longer run after_commit callbacks on the first of multiple Active Record
|
||||
# instances to save changes to the same database row within a transaction.
|
||||
# Instead, run these callbacks on the instance most likely to have internal
|
||||
# state which matches what was committed to the database, typically the last
|
||||
# instance to save.
|
||||
# Rails.application.config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction = false
|
||||
|
||||
# Configures SQLite with a strict strings mode, which disables double-quoted string literals.
|
||||
#
|
||||
# SQLite has some quirks around double-quoted string literals.
|
||||
# It first tries to consider double-quoted strings as identifier names, but if they don't exist
|
||||
# it then considers them as string literals. Because of this, typos can silently go unnoticed.
|
||||
# For example, it is possible to create an index for a non existing column.
|
||||
# See https://www.sqlite.org/quirks.html#double_quoted_string_literals_are_accepted for more details.
|
||||
# Rails.application.config.active_record.sqlite3_adapter_strict_strings_by_default = true
|
||||
|
||||
# Disable deprecated singular associations names
|
||||
# Rails.application.config.active_record.allow_deprecated_singular_associations_name = false
|
||||
|
||||
# Enable the Active Job `BigDecimal` argument serializer, which guarantees
|
||||
# roundtripping. Without this serializer, some queue adapters may serialize
|
||||
# `BigDecimal` arguments as simple (non-roundtrippable) strings.
|
||||
#
|
||||
# When deploying an application with multiple replicas, old (pre-Rails 7.1)
|
||||
# replicas will not be able to deserialize `BigDecimal` arguments from this
|
||||
# serializer. Therefore, this setting should only be enabled after all replicas
|
||||
# have been successfully upgraded to Rails 7.1.
|
||||
# Rails.application.config.active_job.use_big_decimal_serializer = true
|
||||
|
||||
# Specify if an `ArgumentError` should be raised if `Rails.cache` `fetch` or
|
||||
# `write` are given an invalid `expires_at` or `expires_in` time.
|
||||
# Options are `true`, and `false`. If `false`, the exception will be reported
|
||||
# as `handled` and logged instead.
|
||||
# Rails.application.config.active_support.raise_on_invalid_cache_expiration_time = true
|
||||
|
||||
# Specify whether Query Logs will format tags using the SQLCommenter format
|
||||
# (https://open-telemetry.github.io/opentelemetry-sqlcommenter/), or using the legacy format.
|
||||
# Options are `:legacy` and `:sqlcommenter`.
|
||||
# Rails.application.config.active_record.query_log_tags_format = :sqlcommenter
|
||||
|
||||
# Specify the default serializer used by `MessageEncryptor` and `MessageVerifier`
|
||||
# instances.
|
||||
#
|
||||
# The legacy default is `:marshal`, which is a potential vector for
|
||||
# deserialization attacks in cases where a message signing secret has been
|
||||
# leaked.
|
||||
#
|
||||
# In Rails 7.1, the new default is `:json_allow_marshal` which serializes and
|
||||
# deserializes with `ActiveSupport::JSON`, but can fall back to deserializing
|
||||
# with `Marshal` so that legacy messages can still be read.
|
||||
#
|
||||
# In Rails 7.2, the default will become `:json` which serializes and
|
||||
# deserializes with `ActiveSupport::JSON` only.
|
||||
#
|
||||
# Alternatively, you can choose `:message_pack` or `:message_pack_allow_marshal`,
|
||||
# which serialize with `ActiveSupport::MessagePack`. `ActiveSupport::MessagePack`
|
||||
# can roundtrip some Ruby types that are not supported by JSON, and may provide
|
||||
# improved performance, but it requires the `msgpack` gem.
|
||||
#
|
||||
# For more information, see
|
||||
# https://guides.rubyonrails.org/v7.1/configuring.html#config-active-support-message-serializer
|
||||
#
|
||||
# If you are performing a rolling deploy of a Rails 7.1 upgrade, wherein servers
|
||||
# that have not yet been upgraded must be able to read messages from upgraded
|
||||
# servers, first deploy without changing the serializer, then set the serializer
|
||||
# in a subsequent deploy.
|
||||
# Rails.application.config.active_support.message_serializer = :json_allow_marshal
|
||||
|
||||
# Enable a performance optimization that serializes message data and metadata
|
||||
# together. This changes the message format, so messages serialized this way
|
||||
# cannot be read by older versions of Rails. However, messages that use the old
|
||||
# format can still be read, regardless of whether this optimization is enabled.
|
||||
#
|
||||
# To perform a rolling deploy of a Rails 7.1 upgrade, wherein servers that have
|
||||
# not yet been upgraded must be able to read messages from upgraded servers,
|
||||
# leave this optimization off on the first deploy, then enable it on a
|
||||
# subsequent deploy.
|
||||
# Rails.application.config.active_support.use_message_serializer_for_metadata = true
|
||||
|
||||
# Set the maximum size for Rails log files.
|
||||
#
|
||||
# `config.load_defaults 7.1` does not set this value for environments other than
|
||||
# development and test.
|
||||
#
|
||||
# if Rails.env.local?
|
||||
# Rails.application.config.log_file_size = 100 * 1024 * 1024
|
||||
# end
|
||||
|
||||
# Enable raising on assignment to attr_readonly attributes. The previous
|
||||
# behavior would allow assignment but silently not persist changes to the
|
||||
# database.
|
||||
# Rails.application.config.active_record.raise_on_assign_to_attr_readonly = true
|
||||
|
||||
# Enable validating only parent-related columns for presence when the parent is mandatory.
|
||||
# The previous behavior was to validate the presence of the parent record, which performed an extra query
|
||||
# to get the parent every time the child record was updated, even when parent has not changed.
|
||||
# Rails.application.config.active_record.belongs_to_required_validates_foreign_key = false
|
||||
|
||||
# Enable precompilation of `config.filter_parameters`. Precompilation can
|
||||
# improve filtering performance, depending on the quantity and types of filters.
|
||||
# Rails.application.config.precompile_filter_parameters = true
|
||||
|
||||
# Enable before_committed! callbacks on all enrolled records in a transaction.
|
||||
# The previous behavior was to only run the callbacks on the first copy of a record
|
||||
# if there were multiple copies of the same record enrolled in the transaction.
|
||||
# Rails.application.config.active_record.before_committed_on_all_records = true
|
||||
|
||||
# Disable automatic column serialization into YAML.
|
||||
# To keep the historic behavior, you can set it to `YAML`, however it is
|
||||
# recommended to explicitly define the serialization method for each column
|
||||
# rather than to rely on a global default.
|
||||
# Rails.application.config.active_record.default_column_serializer = nil
|
||||
|
||||
# Enable a performance optimization that serializes Active Record models
|
||||
# in a faster and more compact way.
|
||||
#
|
||||
# To perform a rolling deploy of a Rails 7.1 upgrade, wherein servers that have
|
||||
# not yet been upgraded must be able to read caches from upgraded servers,
|
||||
# leave this optimization off on the first deploy, then enable it on a
|
||||
# subsequent deploy.
|
||||
# Rails.application.config.active_record.marshalling_format_version = 7.1
|
||||
|
||||
# Run `after_commit` and `after_*_commit` callbacks in the order they are defined in a model.
|
||||
# This matches the behaviour of all other callbacks.
|
||||
# In previous versions of Rails, they ran in the inverse order.
|
||||
# Rails.application.config.active_record.run_after_transaction_callbacks_in_order_defined = true
|
||||
|
||||
# Whether a `transaction` block is committed or rolled back when exited via `return`, `break` or `throw`.
|
||||
#
|
||||
# Rails.application.config.active_record.commit_transaction_on_non_local_return = true
|
||||
|
||||
# Controls when to generate a value for <tt>has_secure_token</tt> declarations.
|
||||
#
|
||||
# Rails.application.config.active_record.generate_secure_token_on = :initialize
|
||||
|
||||
# ** Please read carefully, this must be configured in config/application.rb **
|
||||
# Change the format of the cache entry.
|
||||
# Changing this default means that all new cache entries added to the cache
|
||||
# will have a different format that is not supported by Rails 7.0
|
||||
# applications.
|
||||
# Only change this value after your application is fully deployed to Rails 7.1
|
||||
# and you have no plans to rollback.
|
||||
# When you're ready to change format, add this to `config/application.rb` (NOT
|
||||
# this file):
|
||||
# config.active_support.cache_format_version = 7.1
|
||||
|
||||
# Configure Action View to use HTML5 standards-compliant sanitizers when they are supported on your
|
||||
# platform.
|
||||
#
|
||||
# `Rails::HTML::Sanitizer.best_supported_vendor` will cause Action View to use HTML5-compliant
|
||||
# sanitizers if they are supported, else fall back to HTML4 sanitizers.
|
||||
#
|
||||
# In previous versions of Rails, Action View always used `Rails::HTML4::Sanitizer` as its vendor.
|
||||
#
|
||||
# Rails.application.config.action_view.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor
|
||||
|
||||
# Configure Action Text to use an HTML5 standards-compliant sanitizer when it is supported on your
|
||||
# platform.
|
||||
#
|
||||
# `Rails::HTML::Sanitizer.best_supported_vendor` will cause Action Text to use HTML5-compliant
|
||||
# sanitizers if they are supported, else fall back to HTML4 sanitizers.
|
||||
#
|
||||
# In previous versions of Rails, Action Text always used `Rails::HTML4::Sanitizer` as its vendor.
|
||||
#
|
||||
# Rails.application.config.action_text.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor
|
||||
|
||||
# Configure the log level used by the DebugExceptions middleware when logging
|
||||
# uncaught exceptions during requests
|
||||
# Rails.application.config.action_dispatch.debug_exception_log_level = :error
|
||||
|
||||
# Configure the test helpers in Action View, Action Dispatch, and rails-dom-testing to use HTML5
|
||||
# parsers.
|
||||
#
|
||||
# Nokogiri::HTML5 isn't supported on JRuby, so JRuby applications must set this to :html4.
|
||||
#
|
||||
# In previous versions of Rails, these test helpers always used an HTML4 parser.
|
||||
#
|
||||
# Rails.application.config.dom_testing_default_html_version = :html5
|
|
@ -0,0 +1,10 @@
|
|||
# Be sure to restart your server when you modify this file.
|
||||
#
|
||||
# This file eases your Rails 7.2 framework defaults upgrade.
|
||||
#
|
||||
# Uncomment each configuration one by one to switch to the new default.
|
||||
# Once your application is ready to run with all new defaults, you can remove
|
||||
# this file and set the `config.load_defaults` to `7.2`.
|
||||
#
|
||||
# Read the Guide for Upgrading Ruby on Rails for more info on each option.
|
||||
# https://guides.rubyonrails.org/upgrading_ruby_on_rails.html
|
|
@ -8,9 +8,9 @@ module Rails
|
|||
|
||||
module VERSION
|
||||
MAJOR = 7
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
TINY = 0
|
||||
PRE = "rc1"
|
||||
PRE = "alpha"
|
||||
|
||||
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
||||
end
|
||||
|
|
17
yarn.lock
17
yarn.lock
|
@ -29,24 +29,31 @@
|
|||
integrity sha512-KE/SxsDqNs3rrWwFHcRh15ZLVFrI0YoZtgAdIyIq9k5hUNmiWRXXThPomIxHuL20sLdgzbDFyvkUMna14bvtrw==
|
||||
|
||||
"@rails/actioncable@file:/workspaces/rails/actioncable":
|
||||
version "7.1.0-rc1"
|
||||
version "7.2.0-alpha"
|
||||
resolved "file:actioncable"
|
||||
|
||||
"@rails/actiontext@file:/workspaces/rails/actiontext":
|
||||
version "7.1.0-rc1"
|
||||
version "7.2.0-alpha"
|
||||
resolved "file:actiontext"
|
||||
dependencies:
|
||||
"@rails/activestorage" ">= 7.1.0-alpha"
|
||||
webpack "^4.17.1"
|
||||
|
||||
"@rails/activestorage@>= 7.1.0-alpha", "@rails/activestorage@file:/workspaces/rails/activestorage":
|
||||
version "7.1.0-rc1"
|
||||
"@rails/activestorage@>= 7.1.0-alpha":
|
||||
version "7.1.0-beta1"
|
||||
resolved "https://registry.npmjs.org/@rails/activestorage/-/activestorage-7.1.0-beta1.tgz"
|
||||
integrity sha512-5qQ5/65tBOVeFMgGq8F+PhXKrmBLMAnVpyZAe8WsCW5DbINRD8l8ysA8+zBmwCIxBMqn+M9hZoQVjuMPr35bvQ==
|
||||
dependencies:
|
||||
spark-md5 "^3.0.1"
|
||||
|
||||
"@rails/activestorage@file:/workspaces/rails/activestorage":
|
||||
version "7.2.0-alpha"
|
||||
resolved "file:activestorage"
|
||||
dependencies:
|
||||
spark-md5 "^3.0.1"
|
||||
|
||||
"@rails/ujs@file:/workspaces/rails/actionview":
|
||||
version "7.1.0-rc1"
|
||||
version "7.2.0-alpha"
|
||||
resolved "file:actionview"
|
||||
|
||||
"@rollup/plugin-commonjs@^19.0.1":
|
||||
|
|
Loading…
Reference in New Issue