1 升級至 Rails 7.2
如果您正在升級現有的應用程式,最好先擁有良好的測試覆蓋率。您也應該先升級至 Rails 7.1,如果您尚未升級,請在嘗試更新至 Rails 7.2 之前,確保您的應用程式仍然按預期執行。升級時需要注意的事項清單可在升級 Ruby on Rails指南中找到。
2 主要功能
2.1 應用程式的開發容器設定
開發容器(簡稱 dev container)可讓您使用容器作為全功能的開發環境。
Rails 7.2 新增了為您的應用程式產生開發容器設定的功能。此設定包含一個 .devcontainer
資料夾,其中包含一個 Dockerfile
、一個 docker-compose.yml
檔案和一個 devcontainer.json
檔案。
預設情況下,開發容器包含下列內容
- 一個 Redis 容器,用於 Kredis、Action Cable 等。
- 一個資料庫(SQLite、Postgres、MySQL 或 MariaDB)
- 一個用於系統測試的 Headless Chrome 容器
- 設定為使用本機磁碟且預覽功能可用的 Active Storage
若要產生具有開發容器的新應用程式,您可以執行
$ rails new myapp --devcontainer
對於現有的應用程式,現在可以使用 devcontainer
命令
$ rails devcontainer
如需更多資訊,請參閱開發容器入門指南。
2.2 預設新增瀏覽器版本保護
Rails 現在新增了指定允許存取所有動作(或某些動作,如 only:
或 except:
所限制)的瀏覽器版本的功能。
只有與傳遞給 versions:
的雜湊或具名集合中比對的瀏覽器,如果低於指定的版本,才會被封鎖。
這表示所有其他未知的瀏覽器,以及未報告使用者代理程式標頭的代理程式,都將被允許存取。
預設情況下,被封鎖的瀏覽器會收到 public/406-unsupported-browser.html
中的檔案,HTTP 狀態碼為「406 Not Acceptable」。
範例
class ApplicationController < ActionController::Base
# Allow only browsers natively supporting webp images, web push, badges, import maps, CSS nesting + :has
allow_browser versions: :modern
end
class ApplicationController < ActionController::Base
# All versions of Chrome and Opera will be allowed, but no versions of "internet explorer" (ie). Safari needs to be 16.4+ and Firefox 121+.
allow_browser versions: { safari: 16.4, firefox: 121, ie: false }
end
class MessagesController < ApplicationController
# In addition to the browsers blocked by ApplicationController, also block Opera below 104 and Chrome below 119 for the show action.
allow_browser versions: { opera: 104, chrome: 119 }, only: :show
end
新產生的應用程式會在 ApplicationController
中設定此保護。
如需更多資訊,請參閱allow_browser 文件。
2.3 將 Ruby 3.1 設定為新的最低版本
到目前為止,Rails 只會在新的主要版本上放棄與舊版 Ruby 的相容性。我們正在變更此政策,因為這會導致我們保持與長期不受支援的 Ruby 版本的相容性,或更頻繁地提升 Rails 主要版本,並且在我們提升主要版本時一次放棄多個 Ruby 版本。
我們現在將在發行時放棄次要 Rails 版本中已終止生命週期的 Ruby 版本。
對於 Rails 7.2,Ruby 3.1 是新的最低版本。
2.4 預設漸進式 Web 應用程式 (PWA) 檔案
為了更好地支援使用 Rails 建立 PWA 應用程式,我們現在產生用於 manifest 和 service worker 的預設 PWA 檔案,這些檔案從 app/views/pwa
提供,並且可以透過 ERB 動態呈現。這些檔案在產生的路由檔案中以預設路由明確掛載在根目錄。
如需更多資訊,請參閱新增此功能的 pull request。
2.5 預設新增 omakase RuboCop 規則
Rails 應用程式現在預設會使用來自 rubocop-rails-omakase 的一組規則設定 RuboCop。
Ruby 是一種精美且富有表現力的語言,它不僅容忍許多不同的方言,還慶祝它們的多樣性。它從來就不是一種要跨所有程式庫、框架或應用程式僅以單一風格編寫的語言。如果您或您的團隊已經開發出一種讓您感到愉快的特定內部風格,您應該珍惜它。
此 RuboCop 風格集合適用於那些尚未承諾任何特定方言的人。他們只是想要一個合理的起點,並且會受益於一些預設規則,至少可以開始以一致的方式進行 Ruby 風格設定。
這些特定的規則不是對或錯,而僅僅代表 Rails 建立者特有的美學敏感性。完整使用它們、將它們作為起點、將它們作為靈感,或以您認為合適的方式使用它們。
2.6 預設為新的應用程式新增 GitHub CI 工作流程
Rails 現在會為新的應用程式新增預設的 GitHub CI 工作流程檔案。這將使新手能夠很好地開始自動掃描、程式碼檢查和測試。我們發現這是在單元測試開始以來,現代時代的自然延續。
當然,在您使用免費權杖之後,GitHub Actions 是一個用於私人儲存庫的商業雲端產品。但是,鑑於 GitHub 和 Rails 之間的關係、該平台對於新手的壓倒性預設性質,以及教導新手良好 CI 習慣的價值,我們認為這是一個可以接受的權衡。
2.7 預設為新的應用程式新增 Brakeman
Brakeman 是防止 Rails 中常見安全性漏洞進入生產環境的好方法。
新的應用程式會安裝 Brakeman,並與 GitHub CI 工作流程結合,它會在每次推送時自動執行。
2.8 為 Puma 線程計數設定新的預設值
Rails 將 Puma 中的預設線程數從 5 變更為 3。
由於良好最佳化的 Rails 應用程式的性質,透過作業執行快速 SQL 查詢和慢速第三方呼叫時,當線程數過高時,Ruby 會花費大量時間等待全域 VM 鎖定 (GVL) 釋放,這會損害延遲 (請求回應時間)。
經過仔細考慮、調查,並根據在生產環境中執行的應用程式的實戰經驗,我們決定預設 3 個線程是在並行性和效能之間取得良好平衡的方法。
您可以在此議題中找到關於此變更的非常詳細的討論。
2.9 防止在交易中排程任務
Active Job 常見的錯誤是在交易內部排入任務佇列,導致任務可能在交易提交之前就被其他程序選取並執行,進而導致各種錯誤。
Topic.transaction do
topic = Topic.create
NewTopicNotificationJob.perform_later(topic)
end
現在,Active Job 會自動將排隊延遲到交易提交之後,如果交易回滾,則會捨棄任務。
各種佇列實作可以選擇停用此行為,而使用者也可以停用此行為,或針對每個任務強制啟用此行為。
class NewTopicNotificationJob < ApplicationJob
self.enqueue_after_transaction_commit = :never
end
2.10 每個交易的提交和回滾回呼
這現在成為可能,因為新增了一個功能,允許在記錄外部註冊交易回呼。
ActiveRecord::Base.transaction
現在會產生一個 ActiveRecord::Transaction
物件,允許在其上註冊回呼。
Article.transaction do |transaction|
article.update(published: true)
transaction.after_commit do
PublishNotificationMailer.with(article: article).deliver_later
end
end
也新增了 ActiveRecord::Base.current_transaction
,允許在其上註冊回呼。
Article.current_transaction.after_commit do
PublishNotificationMailer.with(article: article).deliver_later
end
最後,新增了 ActiveRecord.after_all_transactions_commit
,適用於可能在交易內部或外部執行的程式碼,需要在狀態變更正確持久化之後執行工作。
def publish_article(article)
article.update(published: true)
ActiveRecord.after_all_transactions_commit do
PublishNotificationMailer.with(article: article).deliver_later
end
end
2.11 如果執行 Ruby 3.3+,預設啟用 YJIT
YJIT 是 Ruby 的 JIT 編譯器,自 Ruby 3.1 起在 CRuby 中可用。它可以為 Rails 應用程式提供顯著的效能提升,提供 15-25% 的延遲改進。
在 Rails 7.2 中,如果執行 Ruby 3.3 或更新版本,則預設會啟用 YJIT。
您可以透過設定停用 YJIT
Rails.application.config.yjit = false
2.12 Rails 指南的新設計
當 Rails 7.0 於 2021 年 12 月推出時,它帶來了一個全新的首頁和一個新的啟動畫面。然而,指南的設計自 2009 年以來基本上沒有變動 - 這個問題並非沒有人注意到(我們聽到了您的意見)。
隨著目前所有的工作都集中在移除 Rails 框架的複雜性,並使文件保持一致、清晰和最新,現在是時候處理指南的設計,使其同樣現代化、簡潔和新鮮了。
我們與 UX 設計師 John Athayde 合作,將首頁的外觀和感覺轉移到 Rails 指南,使其乾淨、時尚且最新。
版面配置將保持不變,但從今天起,您將在指南中看到以下變更
- 更乾淨、不那麼忙碌的設計。
- 字型、配色方案和標誌與首頁更加一致。
- 更新的圖示。
- 簡化的導覽。
- 捲動時固定的「章節」導覽列。
2.13 在預設 Dockerfile 中設定 jemalloc 以最佳化記憶體配置
Ruby 使用 malloc
會產生記憶體片段問題,尤其是在使用多執行緒時,例如 Puma 所做的那樣。切換到使用不同模式來避免片段化的配置器可以大幅減少記憶體使用量。
Rails 7.2 現在在預設 Dockerfile 中包含 jemalloc,以最佳化記憶體配置。
2.14 在 bin/setup 中建議 puma-dev 配置
Puma-dev 是在本地開發多個 Rails 應用程式的最佳途徑,如果您不使用 Docker 的話。
Rails 現在會在您在 bin/setup
中找到的新註解中建議如何進行設定。
3 Railties
請參閱變更記錄以取得詳細變更。
3.1 移除
移除已棄用的
Rails::Generators::Testing::Behaviour
。移除已棄用的
Rails.application.secrets
。移除已棄用的
Rails.config.enable_dependency_loading
。移除已棄用的
find_cmd_and_exec
控制台輔助程式。從
new
和db:system:change
rails
命令中移除對oracle
、sqlserver
和 JRuby 特定資料庫轉接器的支援。從產生器中移除
config.public_file_server.enabled
選項。
3.2 棄用
3.3 重要變更
在新的應用程式和外掛程式中,預設加入具有來自 rubocop-rails-omakase 規則的 RuboCop。
在新的應用程式中,加入具有預設配置的 Brakeman 以進行安全性檢查。
在新的應用程式和外掛程式中,預設加入用於 Dependabot、Brakeman、RuboCop 和執行測試的 GitHub CI 檔案。
現在,對於在 Ruby 3.3+ 上執行的新應用程式,預設會啟用 YJIT。
產生一個
.devcontainer
資料夾,以便在 Visual Studio Code 中使用容器執行應用程式。$ rails new myapp --devcontainer
引入
Rails::Generators::Testing::Assertions#assert_initializer
以測試初始化程式。系統測試現在預設對新的應用程式使用 Headless Chrome。
支援
BACKTRACE
環境變數,以便在正常的伺服器執行中關閉回溯清理。先前,這僅適用於測試。為 manifest 和 service worker 新增預設的 Progressive Web App (PWA) 檔案,這些檔案從
app/views/pwa
提供,並使其能夠透過 ERB 動態呈現。
4 Action Cable
請參閱變更記錄以取得詳細變更。
4.1 移除
4.2 棄用
4.3 重要變更
5 Action Pack
請參閱變更記錄以取得詳細變更。
5.1 移除
移除已棄用的常數
ActionDispatch::IllegalStateError
。移除已棄用的常數
AbstractController::Helpers::MissingHelperError
。移除
ActionController::Parameters
和Hash
之間已棄用的比較。移除已棄用的
Rails.application.config.action_dispatch.return_only_request_media_type_on_content_type
。移除已棄用的
speaker
、vibrate
和vr
權限原則指令。移除已棄用的支援,將
Rails.application.config.action_dispatch.show_exceptions
設定為true
和false
。
5.2 棄用
- 棄用
Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality
。
5.3 重要變更
6 Action View
請參閱變更記錄以取得詳細變更。
6.1 移除
- 移除已棄用的
@rails/ujs
,改用 Turbo。
6.2 棄用
- 當使用
tag.br
類型標籤產生器時,棄用將內容傳遞到 void 元素。
6.3 重要變更
7 Action Mailer
請參閱變更記錄以取得詳細變更。
7.1 移除
移除已棄用的
config.action_mailer.preview_path
。移除已棄用的透過
:args
為assert_enqueued_email_with
傳遞參數。
7.2 棄用
7.3 重要變更
8 Active Record
請參閱變更記錄以取得詳細變更。
8.1 移除
移除已棄用的
Rails.application.config.active_record.suppress_multiple_database_warning
。移除已棄用的支援,以便使用不存在的屬性名稱呼叫
alias_attribute
。移除
ActiveRecord::Base.remove_connection
中已棄用的name
引數。移除已棄用的
ActiveRecord::Base.clear_active_connections!
。移除已棄用的
ActiveRecord::Base.clear_reloadable_connections!
。移除已棄用的
ActiveRecord::Base.clear_all_connections!
。移除已棄用的
ActiveRecord::Base.flush_idle_connections!
。移除已棄用的
ActiveRecord::ActiveJobRequiredError
。移除已棄用的支援,以便在具有 2 個引數的連接轉接器中定義
explain
。移除已棄用的
ActiveRecord::LogSubscriber.runtime
方法。移除已棄用的
ActiveRecord::LogSubscriber.runtime=
方法。移除已棄用的
ActiveRecord::LogSubscriber.reset_runtime
方法。移除已棄用的
ActiveRecord::Migration.check_pending
方法。移除已棄用的支援,將
SchemaMigration
和InternalMetadata
類別作為引數傳遞給ActiveRecord::MigrationContext
。移除已棄用的行為,該行為會支援使用其複數名稱來參考單數關聯。
移除已棄用的
TestFixtures.fixture_path
。移除已棄用的支援,讓
ActiveRecord::Base#read_attribute(:id)
傳回自訂主鍵值。移除已棄用的支援,將 coder 和類別作為第二個引數傳遞給
serialize
。從資料庫轉接器中移除已棄用的
#all_foreign_keys_valid?
。移除已棄用的
ActiveRecord::ConnectionAdapters::SchemaCache.load_from
。移除已棄用的
ActiveRecord::ConnectionAdapters::SchemaCache#data_sources
。移除已棄用的
#all_connection_pools
。移除已棄用的支援,以便在未提供
role
引數時,將#connection_pool_list
、#active_connections?
、#clear_active_connections!
、#clear_reloadable_connections!
、#clear_all_connections!
和#flush_idle_connections!
應用於目前角色的連接集區。移除已棄用的
ActiveRecord::ConnectionAdapters::ConnectionPool#connection_klass
。移除已棄用的
#quote_bound_value
。移除已棄用的支援,以便引述
ActiveSupport::Duration
。移除已棄用的支援,以便將
deferrable: true
傳遞給add_foreign_key
。移除已棄用的支援,以便將
rewhere
傳遞給ActiveRecord::Relation#merge
。移除已棄用的行為,該行為會在使用
return
、break
或throw
退出時回滾交易區塊。
8.2 棄用
棄用
Rails.application.config.active_record.allow_deprecated_singular_associations_name
棄用
Rails.application.config.active_record.commit_transaction_on_non_local_return
8.3 重要變更
9 Active Storage
請參閱變更記錄以取得詳細變更。
9.1 移除
移除已棄用的
config.active_storage.replace_on_assign_to_many
。移除已棄用的
config.active_storage.silence_invalid_content_types_warning
。
9.2 棄用
9.3 重要變更
10 Active Model
請參閱變更記錄以取得詳細變更。
10.1 移除
10.2 棄用
10.3 重要變更
11 Active Support
請參閱變更記錄以取得詳細變更。
11.1 移除
移除已棄用的
ActiveSupport::Notifications::Event#children
和ActiveSupport::Notifications::Event#parent_of?
。移除已棄用的支援,以便在不傳遞棄用程式的情況下呼叫下列方法
deprecate
deprecate_constant
ActiveSupport::Deprecation::DeprecatedObjectProxy.new
ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new
ActiveSupport::Deprecation::DeprecatedConstantProxy.new
assert_deprecated
assert_not_deprecated
collect_deprecations
移除
ActiveSupport::Deprecation
委派至執行個體中已棄用的部分。移除已棄用的
SafeBuffer#clone_empty
。從
Array
、Date
、DateTime
和Time
中移除已棄用的#to_default_s
。移除快取儲存的已棄用
:pool_size
和:pool_timeout
選項。移除已棄用的支援,以便使用
config.active_support.cache_format_version = 6.1
。移除已棄用的常數
ActiveSupport::LogSubscriber::CLEAR
和ActiveSupport::LogSubscriber::BOLD
。移除已棄用的支援,以便在
ActiveSupport::LogSubscriber#color
中使用位置布林值來加粗記錄文字。移除已棄用的
config.active_support.disable_to_s_conversion
。移除已棄用的
config.active_support.remove_deprecated_time_with_zone_name
。移除已棄用的
config.active_support.use_rfc4122_namespaced_uuids
。移除已棄用的支援,以便將
Dalli::Client
執行個體傳遞給MemCacheStore
。
11.2 棄用
11.3 重要變更
12 Active Job
請參閱變更記錄以取得詳細變更。
12.1 移除
移除已棄用的
BigDecimal
引數的原始序列化程式。移除已棄用的支援,以便將數值設定為
scheduled_at
屬性。移除
retry_on
中:wait
屬性已棄用的:exponentially_longer
值。
12.2 已棄用功能
- 棄用
Rails.application.config.active_job.use_big_decimal_serialize
。
12.3 重要變更
13 Action Text
請參閱 Changelog 以了解詳細變更。
13.1 移除功能
13.2 已棄用功能
13.3 重要變更
14 Action Mailbox
請參閱 Changelog 以了解詳細變更。
14.1 移除功能
14.2 已棄用功能
14.3 重要變更
15 Ruby on Rails 指南
請參閱 Changelog 以了解詳細變更。
15.1 重要變更
16 致謝
請參閱 Rails 貢獻者完整列表,感謝許多人投入大量時間,使 Rails 成為一個穩定且強大的框架。向他們所有人致敬。