更多資訊請見 rubyonrails.org:

Ruby on Rails 7.1 發行說明

Rails 7.1 的重點

  • 為新的 Rails 應用程式產生 Dockerfile
  • 新增 ActiveRecord::Base.normalizes
  • 新增 ActiveRecord::Base.generates_token_for
  • 新增 perform_all_later 以一次將多個任務排入佇列
  • 複合主鍵
  • Trilogy 引入轉接器
  • 新增 ActiveSupport::MessagePack
  • 引入 config.autoload_libconfig.autoload_lib_once 以增強自動載入
  • 用於一般非同步查詢的 Active Record API
  • 允許範本設定嚴格的 locals
  • 新增 Rails.application.deprecators
  • 支援 JSON response.parsed_body 的模式比對
  • 擴展 response.parsed_body 以使用 Nokogiri 剖析 HTML
  • 引入 ActionView::TestCase.register_parser

這些發行說明僅涵蓋主要變更。若要了解各種錯誤修正和變更,請參閱變更日誌或查看 GitHub 上主要 Rails 儲存庫中的提交清單

1 升級至 Rails 7.1

如果您要升級現有的應用程式,最好在開始之前先進行良好的測試覆蓋。您也應該先升級至 Rails 7.0(如果您尚未升級),並在嘗試更新至 Rails 7.1 之前,確認您的應用程式仍然如預期運作。升級時需要注意的事項清單可在升級 Ruby on Rails指南中找到。

2 主要功能

2.1 為新的 Rails 應用程式產生 Dockerfile

新的 Rails 應用程式的預設 Docker 支援。當產生新的應用程式時,Rails 現在會在應用程式中包含 Docker 相關檔案。

這些檔案是使用 Docker 在生產環境中部署 Rails 應用程式的基本設定。請務必注意,這些檔案不是用於開發目的。

以下是如何使用這些 Docker 檔案建置和執行 Rails 應用程式的快速範例

$ 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=<your-config-master-key> app

您也可以從此 Docker 映像啟動主控台或執行器

$ docker run --rm -it -v app-storage:/rails/storage --env RAILS_MASTER_KEY=<your-config-master-key> app console

對於那些想要建立多平台映像(例如,用於 AMD 或 Intel 部署的 Apple Silicon),並將其推送到 Docker Hub 的人,請按照以下步驟操作

$ docker login -u <your-user>
$ docker buildx create --use
$ docker buildx build --push --platform=linux/amd64,linux/arm64 -t <your-user/image-name> .

此增強功能簡化了部署過程,為在生產環境中啟動並執行 Rails 應用程式提供了一個方便的起點。

2.2 新增 ActiveRecord::Base.normalizes

ActiveRecord::Base.normalizes宣告屬性正規化。當屬性被指派或更新時,會套用正規化,並且正規化的值將會持續保存到資料庫。正規化也會套用到查詢方法的對應關鍵字引數,允許使用未正規化的值來查詢記錄。

例如

class User < ActiveRecord::Base
  normalizes :email, with: -> email { email.strip.downcase }
  normalizes :phone, with: -> phone { phone.delete("^0-9").delete_prefix("1") }
end

user = User.create(email: " CRUISE-CONTROL@EXAMPLE.COM\n")
user.email                  # => "cruise-control@example.com"

user = User.find_by(email: "\tCRUISE-CONTROL@EXAMPLE.COM ")
user.email                  # => "cruise-control@example.com"
user.email_before_type_cast # => "cruise-control@example.com"

User.where(email: "\tCRUISE-CONTROL@EXAMPLE.COM ").count         # => 1
User.where(["email = ?", "\tCRUISE-CONTROL@EXAMPLE.COM "]).count # => 0

User.exists?(email: "\tCRUISE-CONTROL@EXAMPLE.COM ")         # => true
User.exists?(["email = ?", "\tCRUISE-CONTROL@EXAMPLE.COM "]) # => false

User.normalize_value_for(:phone, "+1 (555) 867-5309") # => "5558675309"

2.3 新增 ActiveRecord::Base.generates_token_for

ActiveRecord::Base.generates_token_for定義為特定目的產生權杖。產生的權杖可能會過期,並且也可以嵌入記錄資料。當使用權杖提取記錄時,會比較權杖中的資料和記錄中的目前資料。如果兩者不符,權杖將被視為無效,與過期的情況相同。

以下是實作單次使用密碼重設權杖的範例

class User < ActiveRecord::Base
  has_secure_password

  generates_token_for :password_reset, expires_in: 15.minutes do
    # `password_salt` (defined by `has_secure_password`) returns the salt for
    # the password. The salt changes when the password is changed, so the token
    # will expire when the password is changed.
    password_salt&.last(10)
  end
end

user = User.first
token = user.generate_token_for(:password_reset)

User.find_by_token_for(:password_reset, token) # => user

user.update!(password: "new password")
User.find_by_token_for(:password_reset, token) # => nil

2.4 新增 perform_all_later 以一次將多個任務排入佇列

Active Job 中的 perform_all_later 方法,旨在簡化同時將多個任務排入佇列的流程。此強大的新增功能可讓您有效率地將任務排入佇列,而不會觸發回呼。當您需要一次將一批任務排入佇列時,這特別有用,可減少多次往返佇列資料存放區的開銷。

以下是如何利用 perform_all_later

# Enqueueing individual jobs
ActiveJob.perform_all_later(MyJob.new("hello", 42), MyJob.new("world", 0))

# Enqueueing an array of jobs
user_jobs = User.pluck(:id).map { |id| UserJob.new(user_id: id) }
ActiveJob.perform_all_later(user_jobs)

透過利用 perform_all_later,您可以最佳化任務排入佇列的流程,並利用提高的效率,尤其是在處理大量任務時。值得注意的是,對於支援新 enqueue_all 方法的佇列轉接器,例如 Sidekiq 轉接器,排入佇列的流程會使用 push_bulk 進一步最佳化。

請注意,此新方法會引入一個單獨的事件 enqueue_all.active_job,並且不會使用現有的 enqueue.active_job 事件。這確保了大量排入佇列流程的精確追蹤和報告。

2.5 複合主鍵

現在在資料庫和應用程式層級都支援複合主鍵。Rails 可以直接從結構描述中推導出這些索引鍵。此功能對於多對多關係和其他複雜資料模型特別有利,其中單一資料行不足以唯一識別記錄。

Active Record 中查詢方法(例如 #reload#update#delete)產生的 SQL 將包含複合主鍵的所有部分。#first#last 之類的方法將在 ORDER BY 陳述式中使用完整的複合主鍵。

query_constraints 巨集可以用作「虛擬主鍵」,以在不修改資料庫結構描述的情況下達成相同的行為。範例

class TravelRoute < ActiveRecord::Base
  query_constraints :origin, :destination
end

同樣地,關聯接受 query_constraints: 選項。此選項用作複合外鍵,設定用於存取相關記錄的資料行清單。

範例

class TravelRouteReview < ActiveRecord::Base
  belongs_to :travel_route, query_constraints: [:travel_route_origin, :travel_route_destination]
end

2.6Trilogy 引入轉接器

引入新的轉接器,以方便將與 MySQL 相容的資料庫用戶端 Trilogy 與 Rails 應用程式無縫整合。現在,Rails 應用程式可以透過設定其 config/database.yml 檔案,選擇加入 Trilogy 功能。例如

development:
  adapter: trilogy
  database: blog_development
  pool: 5

或者,可以使用 DATABASE_URL 環境變數來達成整合

ENV["DATABASE_URL"] # => "trilogy://127.0.0.1/blog_development?pool=5"

2.7 新增 ActiveSupport::MessagePack

ActiveSupport::MessagePack 是與 msgpack gem 整合的序列化程式。ActiveSupport::MessagePack 可以序列化 msgpack 支援的基本 Ruby 類型,以及數種額外類型,例如 TimeActiveSupport::TimeWithZoneActiveSupport::HashWithIndifferentAccess。與 JSONMarshal 相比,ActiveSupport::MessagePack 可以減少酬載大小並提高效能。

ActiveSupport::MessagePack 可用作訊息序列化程式

config.active_support.message_serializer = :message_pack

# Or individually:
ActiveSupport::MessageEncryptor.new(secret, serializer: :message_pack)
ActiveSupport::MessageVerifier.new(secret, serializer: :message_pack)

作為Cookie 序列化程式

config.action_dispatch.cookies_serializer = :message_pack

以及作為快取序列化程式

config.cache_store = :file_store, "tmp/cache", { serializer: :message_pack }

# Or individually:
ActiveSupport::Cache.lookup_store(:file_store, "tmp/cache", serializer: :message_pack)

2.8 引入 config.autoload_libconfig.autoload_lib_once 以增強自動載入

新增了一個 新的配置方法 config.autoload_lib(ignore:)。這個方法用於增強應用程式的自動載入路徑,將預設不包含的 lib 目錄加入其中。此外,新的應用程式會自動產生 config.autoload_lib(ignore: %w(assets tasks))

當從 config/application.rbconfig/environments/*.rb 呼叫時,此方法會將 lib 目錄加入到 config.autoload_pathsconfig.eager_load_paths 中。請注意,此功能不適用於引擎 (engines)。

為了確保彈性,可以使用 ignore 關鍵字參數來指定 lib 目錄中不應由自動載入器管理的子目錄。例如,您可以將 assetstasksgenerators 等目錄傳遞給 ignore 參數來排除它們。

config.autoload_lib(ignore: %w(assets tasks generators))

config.autoload_lib_once 方法config.autoload_lib 類似,不同之處在於它將 lib 加入到 config.autoload_once_paths 中。

請參閱自動載入指南以了解更多詳細資訊。

2.9 Active Record API 用於一般的非同步查詢

Active Record API 引入了一項重大改進,擴展了其對非同步查詢的支援。此增強功能旨在更有效地處理較慢的查詢,特別是針對彙總 (例如 countsum 等) 以及所有回傳單一記錄或任何非 Relation 的方法。

新的 API 包含以下非同步方法:

  • async_count
  • async_sum
  • async_minimum
  • async_maximum
  • async_average
  • async_pluck
  • async_pick
  • async_ids
  • async_find_by_sql
  • async_count_by_sql

以下是一個簡單的範例,說明如何使用其中一個方法 async_count,以非同步的方式計算已發布的文章數量:

# Synchronous count
published_count = Post.where(published: true).count # => 10

# Asynchronous count
promise = Post.where(published: true).async_count # => #<ActiveRecord::Promise status=pending>
promise.value # => 10

這些方法允許以非同步方式執行這些操作,這可以顯著提高某些類型資料庫查詢的效能。

2.10 允許範本設定嚴格的 locals

引入了一個新功能,允許範本設定明確的 locals。此增強功能在將變數傳遞給範本時,提供了更高的控制和清晰度。

預設情況下,範本將接受任何 locals 作為關鍵字參數。但是,現在您可以在範本檔案的開頭新增一個 locals 魔術註解來定義範本應接受哪些 locals

以下說明其運作方式:

<%# locals: (message:) -%>
<%= message %>

您也可以為這些 locals 設定預設值:

<%# locals: (message: "Hello, world!") -%>
<%= message %>

可選的關鍵字參數可以使用 splat 運算符展開:

<%# locals: (message: "Hello, world!", **attributes) -%>
<%= tag.p(message, **attributes) %>

如果您想要完全禁用 locals 的使用,可以這樣做:

<%# locals: () %>

Action View 將會處理任何支援 # 前綴註解的範本引擎中的 locals: 魔術註解,並將從 partial 中的任何行讀取魔術註解。

僅支援關鍵字參數。定義位置參數或區塊參數將會在呈現時引發 Action View 錯誤。

2.11 新增 Rails.application.deprecators

新的 Rails.application.deprecators 方法會回傳您應用程式中受管理的棄用器集合,並允許您輕鬆新增和擷取個別的棄用器。

Rails.application.deprecators[:my_gem] = ActiveSupport::Deprecation.new("2.0", "MyGem")
Rails.application.deprecators[:other_gem] = ActiveSupport::Deprecation.new("3.0", "OtherGem")

集合的配置設定會影響集合中的所有棄用器。

Rails.application.deprecators.debug = true

Rails.application.deprecators[:my_gem].debug
# => true

Rails.application.deprecators[:other_gem].debug
# => true

在某些情況下,您可能想要針對特定的程式碼區塊靜音所有棄用器警告。使用棄用器集合,您可以輕鬆地在區塊內靜音所有棄用器警告:

Rails.application.deprecators.silence do
  Rails.application.deprecators[:my_gem].warn    # No warning (silenced)
  Rails.application.deprecators[:other_gem].warn # No warning (silenced)
end

2.12 支援 JSON response.parsed_body 的模式比對

ActionDispatch::IntegrationTest 測試區塊呼叫 JSON 回應的 response.parsed_body 時,其 payload 將會以不區分大小寫的存取方式提供。這使得與 Ruby 的模式比對,以及內建的 Minitest 對模式比對的支援整合成為可能。

get "/posts.json"

response.content_type         # => "application/json; charset=utf-8"
response.parsed_body.class    # => Array
response.parsed_body          # => [{"id"=>42, "title"=>"Title"},...

assert_pattern { response.parsed_body => [{ id: 42 }] }

get "/posts/42.json"

response.content_type         # => "application/json; charset=utf-8"
response.parsed_body.class    # => ActiveSupport::HashWithIndifferentAccess
response.parsed_body          # => {"id"=>42, "title"=>"Title"}

assert_pattern { response.parsed_body => [{ title: /title/i }] }

2.13 擴展 response.parsed_body 以使用 Nokogiri 解析 HTML

擴展 ActionDispatch::Testing 模組,以支援將 HTML response.body 的值解析為 Nokogiri::HTML5::Document 實例。

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..."

新增的 Nokogiri 對模式比對的支援,以及內建的 Minitest 對模式比對的支援,提供了機會來針對 HTML 回應的結構和內容進行測試斷言。

get "/posts"

html = response.parsed_body # => <html>
                            #      <head></head>
                            #        <body>
                            #          <main><h1>Some main content</h1></main>
                            #        </body>
                            #     </html>

assert_pattern { html.at("main") => { content: "Some main content" } }
assert_pattern { html.at("main") => { content: /content/ } }
assert_pattern { html.at("main") => { children: [{ name: "h1", content: /content/ }] } }

2.14 引入 ActionView::TestCase.register_parser

擴展 ActionView::TestCase,以支援將視圖 partial 呈現的內容解析為已知的結構。預設情況下,定義 rendered_html 將 HTML 解析為 Nokogiri::XML::Node,並定義 rendered_json 將 JSON 解析為 ActiveSupport::HashWithIndifferentAccess

test "renders HTML" do
  article = Article.create!(title: "Hello, world")

  render partial: "articles/article", locals: { article: article }

  assert_pattern { rendered_html.at("main h1") => { content: "Hello, world" } }
end

test "renders JSON" do
  article = Article.create!(title: "Hello, world")

  render formats: :json, partial: "articles/article", locals: { article: article }

  assert_pattern { rendered_json => { title: "Hello, world" } }
end

要將呈現的內容解析為 RSS,請註冊對 RSS::Parser.parse 的呼叫。

register_parser :rss, -> rendered { RSS::Parser.parse(rendered) }

test "renders RSS" do
  article = Article.create!(title: "Hello, world")

  render formats: :rss, partial: article, locals: { article: article }

  assert_equal "Hello, world", rendered_rss.items.last.title
end

要將呈現的內容解析為 Capybara::Simple::Node,請使用對 Capybara.string 的呼叫重新註冊一個 :html 解析器。

register_parser :html, -> rendered { Capybara.string(rendered) }

test "renders HTML" do
  article = Article.create!(title: "Hello, world")

  render partial: article

  rendered_html.assert_css "main h1", text: "Hello, world"
end

3 Railties

請參閱 Changelog 以了解詳細的變更。

3.1 移除

  • 移除已棄用的 bin/rails secrets:setup 命令。

  • 移除預設的 X-Download-Options 標頭,因為它僅由 Internet Explorer 使用。

3.2 棄用

  • 棄用 Rails.application.secrets 的使用。

  • 棄用 secrets:showsecrets:edit 命令,改用 credentials

  • 棄用 Rails::Generators::Testing::Behaviour,改用 Rails::Generators::Testing::Behavior

3.3 值得注意的變更

  • 新增 sandbox_by_default 選項,以預設在沙箱模式下啟動 rails console。

  • 新增用於支援按行範圍篩選測試的新語法。

  • 新增 DATABASE 選項,允許在執行 rails railties:install:migrations 命令複製遷移時指定目標資料庫。

  • rails new --javascript 產生器中新增對 Bun 的支援。

    $ rails new my_new_app --javascript=bun
    
  • 新增將慢速測試顯示到測試執行器的功能。

4 Action Cable

請參閱 Changelog 以了解詳細的變更。

4.1 移除

4.2 棄用

4.3 值得注意的變更

  • 新增 capture_broadcasts 測試輔助方法,以擷取區塊中廣播的所有訊息。

  • 新增 Redis pub/sub 适配器在 Redis 連線遺失時自動重新連線的功能。

  • ActionCable::Connection::Base 新增命令回調 before_commandafter_commandaround_command

5 Action Pack

請參閱 Changelog 以了解詳細的變更。

5.1 移除

  • 移除 Request#content_type 上已棄用的行為。

  • 移除將單一值指定給 config.action_dispatch.trusted_proxies 的已棄用功能。

  • 移除系統測試的已棄用 poltergeistwebkit (capybara-webkit) 驅動程式註冊。

5.2 棄用

  • 棄用 config.action_dispatch.return_only_request_media_type_on_content_type

  • 棄用 AbstractController::Helpers::MissingHelperError

  • 棄用 ActionDispatch::IllegalStateError

  • 棄用 speakervibratevr 權限策略指令。

  • 棄用 config.action_dispatch.show_exceptionstruefalse 值,改用 :all:rescuable:none

5.3 值得注意的變更

  • ActionController::Parameters 新增 exclude? 方法。它是 include? 方法的反向。

  • 新增 ActionController::Parameters#extract_value 方法,允許從參數中提取序列化的值。

  • 新增使用自訂邏輯來儲存和擷取 CSRF 令牌的功能。

  • 為系統測試螢幕截圖輔助方法新增 htmlscreenshot 關鍵字參數。

6 Action View

請參閱 Changelog 以了解詳細的變更。

6.1 移除

  • 移除已棄用的常數 ActionView::Path

  • 移除將實例變數作為局部變數傳遞給 partial 的已棄用支援。

6.2 棄用

6.3 值得注意的變更

  • checkbox_tagradio_button_tag 現在接受 checked 作為關鍵字參數。

  • 新增 picture_tag 輔助方法來產生 HTML <picture> 標籤。

  • simple_format 輔助方法現在處理 :sanitize_options 功能,允許為清理過程新增額外的選項。

    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>"
    

7 Action Mailer

請參閱 Changelog 以了解詳細的變更。

7.1 移除

7.2 棄用

  • 棄用 config.action_mailer.preview_path

  • 棄用透過 :args 關鍵字參數將參數傳遞給 assert_enqueued_email_with。現在支援 :params 關鍵字參數,因此請使用它來傳遞參數。

7.3 值得注意的變更

  • 新增 config.action_mailer.preview_paths 以支援多個預覽路徑。

  • 在測試輔助方法中新增 capture_emails 以擷取區塊中傳送的所有電子郵件。

  • ActionMailer::TestHelper 新增 deliver_enqueued_emails,以傳遞所有已佇列的電子郵件作業。

8 Active Record

請參閱 Changelog 以了解詳細的變更。

8.1 移除

  • 移除對 ActiveRecord.legacy_connection_handling 的支援。

  • 移除已棄用的 ActiveRecord::Base 配置存取器。

  • 移除 configs_for 上對 :include_replicas 的支援。改用 :include_hidden

  • 移除已棄用的 config.active_record.partial_writes

  • 移除已棄用的 Tasks::DatabaseTasks.schema_file_type

  • 移除 PostgreSQL 結構轉儲中的 --no-comments 標誌。

8.2 棄用

  • 棄用 #remove_connection 上的 name 參數。

  • 棄用 check_pending!,改用 check_all_pending!

  • 棄用 add_foreign_keydeferrable: true 選項,改用 deferrable: :immediate

  • 棄用 TestFixtures#fixture_path,改用 TestFixtures#fixture_paths

  • 棄用從 Baseconnection_handler 的委派。

  • 棄用 config.active_record.suppress_multiple_database_warning

  • 棄用在 SQL 字串範本中將 ActiveSupport::Duration 用作內插的綁定參數。

  • 棄用 all_connection_pools,並讓 connection_pool_list 更明確。

  • 棄用當主鍵不是 :id 時,read_attribute(:id) 回傳主鍵的行為。

  • 棄用 #merge 上的 rewhere 參數。

  • 棄用使用 alias_attribute 為非屬性設定別名。

8.3 值得注意的變更

  • 新增 TestFixtures#fixture_paths 以支援多個 fixture 路徑。

  • 在使用 has_secure_password 時新增 authenticate_by

  • ActiveRecord::Persistence 新增 update_attribute!,它類似於 update_attribute,但在 before_* 回調拋出 :abort 時引發 ActiveRecord::RecordNotSaved

  • 允許將別名屬性與 insert_all/upsert_all 一起使用。

  • add_index 新增 :include 選項。

  • 新增 #regroup 查詢方法,作為 .unscope(:group).group(fields) 的簡寫。

  • SQLite3 适配器新增對自動填充欄位和自訂主鍵的支援。

  • SQLite3 資料庫連線新增現代化、高效能的預設值。

  • 允許使用資料行組語法指定 where 子句。

    Topic.where([:title, :author_name] => [["The Alchemist", "Paulo Coelho"], ["Harry Potter", "J.K Rowling"]])
    
  • 自動產生的索引名稱現在限制為 62 個位元組,這符合 MySQL、PostgreSQL 和 SQLite 的預設索引名稱長度限制。

  • 引入 Trilogy 資料庫用戶端的介面卡。

  • 新增 ActiveRecord.disconnect_all! 方法,可立即關閉所有連線池的所有連線。

  • 為列舉重新命名、新增值和重新命名值新增 PostgreSQL 遷移命令。

  • 新增 ActiveRecord::Base#id_value 別名,以存取記錄 ID 資料行的原始值。

  • enum 新增驗證選項。

9 Active Storage

請參閱變更日誌,以取得詳細變更資訊。

9.1 移除

  • 移除 Active Storage 設定中已棄用的無效預設內容類型。

  • 移除已棄用的 ActiveStorage::Current#hostActiveStorage::Current#host= 方法。

  • 移除在指派給附件集合時的已棄用行為。現在會替換集合,而不是附加到集合。

  • 從附件關聯中移除已棄用的 purgepurge_later 方法。

9.2 棄用

9.3 重大變更

  • ActiveStorage::Analyzer::AudioAnalyzer 現在會在輸出 metadata 雜湊中輸出 sample_ratetags

  • 新增在附件上叫用 previewrepresentation 方法時,利用預先定義的變體的選項。

  • 宣告變體以預先處理變體時,新增 preprocessed 選項。

  • 新增銷毀 Active Storage 變體的功能。

    User.first.avatar.variant(resize_to_limit: [100, 100]).destroy
    

10 Active Model

請參閱變更日誌,以取得詳細變更資訊。

10.1 移除

10.2 棄用

10.3 重大變更

  • LengthValidator:in/:within 選項新增對無限範圍的支援。

    validates_length_of :first_name, in: ..30
    
  • inclusivity/exclusivity 驗證器新增對無起點範圍的支援。

    validates_inclusion_of :birth_date, in: -> { (..Date.today) }
    
    validates_exclusion_of :birth_date, in: -> { (..Date.today) }
    
  • has_secure_password 新增密碼挑戰的支援。設定時,驗證密碼挑戰是否與持久儲存的 password_digest 相符。

  • 允許驗證器接受沒有記錄引數的 lambda。

    # 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 }
    

11 Active Support

請參閱變更日誌,以取得詳細變更資訊。

11.1 移除

  • 移除已棄用的 Enumerable#sum 覆寫。

  • 移除已棄用的 ActiveSupport::PerThreadRegistry

  • 移除已棄用將格式傳遞給 ArrayRangeDateDateTimeTimeBigDecimalFloatInteger 中的 #to_s 的選項。

  • 移除已棄用的 ActiveSupport::TimeWithZone.name 覆寫。

  • 移除已棄用的 active_support/core_ext/uri 檔案。

  • 移除已棄用的 active_support/core_ext/range/include_time_with_zone 檔案。

  • 移除 ActiveSupport::SafeBuffer 將物件隱式轉換為 String 的功能。

  • 移除在提供非 Digest::UUID 上定義的常數之一的命名空間 ID 時,產生不正確 RFC 4122 UUID 的已棄用支援。

11.2 棄用

  • 棄用 config.active_support.disable_to_s_conversion

  • 棄用 config.active_support.remove_deprecated_time_with_zone_name

  • 棄用 config.active_support.use_rfc4122_namespaced_uuids

  • 棄用 SafeBuffer#clone_empty

  • 棄用單例 ActiveSupport::Deprecation 的使用。

  • 棄用使用 Dalli::Client 的執行個體初始化 ActiveSupport::Cache::MemCacheStore

  • 棄用 Notification::Event#children#parent_of? 方法。

11.3 重大變更

12 Active Job

請參閱變更日誌,以取得詳細變更資訊。

12.1 移除

  • 移除 QueAdapter

12.2 棄用

12.3 重大變更

  • 新增 perform_all_later,以便一次將多個工作加入佇列。

  • 為工作產生器新增 --parent 選項,以指定工作的父類別。

  • after_discard 方法新增至 ActiveJob::Base,以便在即將捨棄工作時執行回呼。

  • 新增對記錄背景工作加入佇列呼叫者的支援。

13 Action Text

請參閱變更日誌,以取得詳細變更資訊。

13.1 移除

13.2 棄用

13.3 重大變更

14 Action Mailbox

請參閱變更日誌,以取得詳細變更資訊。

14.1 移除

14.2 棄用

14.3 重大變更

  • X-Forwarded-To 位址新增至收件者。

  • bounce_now_with 方法新增至 ActionMailbox::Base,以便在不經過郵件程式佇列的情況下傳送退回電子郵件。

15 Ruby on Rails 指南

請參閱變更日誌,以取得詳細變更資訊。

15.1 重大變更

16 貢獻者

請參閱Rails 的完整貢獻者清單,了解花費許多時間讓 Rails 成為如此穩定且強大的架構的許多人。向他們所有人致敬。



返回頂端