更多資訊請參考 rubyonrails.org:

Ruby on Rails 7.2 發行版本說明

Rails 7.2 中的重點

  • 應用程式的開發容器設定。
  • 預設新增瀏覽器版本保護。
  • 將 Ruby 3.1 設定為新的最低版本。
  • 預設漸進式 Web 應用程式 (PWA) 檔案。
  • 預設新增 omakase RuboCop 規則。
  • 預設為新的應用程式新增 GitHub CI 工作流程。
  • 預設為新的應用程式新增 Brakeman。
  • 為 Puma 線程計數設定新的預設值。
  • 防止在事務中排程作業。
  • 每個事務的提交和回滾回呼。
  • 如果執行 Ruby 3.3+,則預設啟用 YJIT。
  • Rails 指南的新設計。
  • 在預設 Dockerfile 中設定 jemalloc 以最佳化記憶體配置。
  • 在 bin/setup 中建議 puma-dev 設定。

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

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

請參閱 #51474#51426 以取得更多資訊。

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 控制台輔助程式。

  • newdb:system:change rails 命令中移除對 oraclesqlserver 和 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::ParametersHash 之間已棄用的比較。

  • 移除已棄用的 Rails.application.config.action_dispatch.return_only_request_media_type_on_content_type

  • 移除已棄用的 speakervibratevr 權限原則指令。

  • 移除已棄用的支援,將 Rails.application.config.action_dispatch.show_exceptions 設定為 truefalse

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

  • 移除已棄用的透過 :argsassert_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 方法。

  • 移除已棄用的支援,將 SchemaMigrationInternalMetadata 類別作為引數傳遞給 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

  • 移除已棄用的行為,該行為會在使用 returnbreakthrow 退出時回滾交易區塊。

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#childrenActiveSupport::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

  • ArrayDateDateTimeTime 中移除已棄用的 #to_default_s

  • 移除快取儲存的已棄用 :pool_size:pool_timeout 選項。

  • 移除已棄用的支援,以便使用 config.active_support.cache_format_version = 6.1

  • 移除已棄用的常數 ActiveSupport::LogSubscriber::CLEARActiveSupport::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 成為一個穩定且強大的框架。向他們所有人致敬。



返回頂部