v7.1.3.2
更多資訊在 rubyonrails.org: 更多 Ruby on Rails

Ruby on Rails 7.0 版本說明

Rails 7.0 的重點

1 升級到 Rails 7.0

如果您要升級現有的應用程式,在開始之前,建議先做好測試涵蓋範圍。您也應該先升級到 Rails 6.1(如果您尚未升級),並確保您的應用程式在嘗試更新到 Rails 7.0 之前,仍能如預期執行。您可以在 升級 Ruby on Rails 指南中找到升級時需要注意的事項清單。

2 主要功能

3 Railties

請參閱 變更記錄,以了解詳細變更。

3.1 移除

  • 移除 dbconsole 中已棄用的 config

3.2 已棄用

3.3 顯著變更

  • Sprockets 現在是可選的依賴項

    rails 寶石不再依賴 sprockets-rails。如果您的應用程式仍需要使用 Sprockets,請務必將 sprockets-rails 新增到您的 Gemfile。

    gem "sprockets-rails"
    

4 Action Cable

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

4.1 移除

4.2 已棄用

4.3 顯著變更

5 Action Pack

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

5.1 移除

  • 移除已棄用的 ActionDispatch::Response.return_only_media_type_on_content_type

  • 移除已棄用的 Rails.config.action_dispatch.hosts_response_app

  • 移除已棄用的 ActionDispatch::SystemTestCase#host!

  • 移除已棄用的支援,將路徑傳遞給相對於 fixture_pathfixture_file_upload

5.2 已棄用

5.3 顯著變更

6 Action View

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

6.1 移除

  • 移除已棄用的 Rails.config.action_view.raise_on_missing_translations

6.2 已棄用

6.3 顯著變更

  • 如果物件用於建立 URL,button_to 會從 Active Record 物件推論 HTTP 動詞 [method]

    button_to("Do a POST", [:do_post_action, Workshop.find(1)])
    # Before
    #=>   <input type="hidden" name="_method" value="post" autocomplete="off" />
    # After
    #=>   <input type="hidden" name="_method" value="patch" autocomplete="off" />
    

7 Action Mailer

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

7.1 移除

  • 移除已棄用的 ActionMailer::DeliveryJobActionMailer::Parameterized::DeliveryJob,改用 ActionMailer::MailDeliveryJob

7.2 已棄用

7.3 顯著變更

8 Active Record

有關詳細變更,請參閱 變更記錄

8.1 移除

  • 移除 connected_to 中已過期的 database 關鍵字參數。

  • 移除已過期的 ActiveRecord::Base.allow_unsafe_raw_sql

  • 移除 configs_for 方法中已過期的 :spec_name 選項。

  • 移除 Rails 4.2 和 4.1 格式中已過期的支援,以 YAML 載入 ActiveRecord::Base 實例。

  • 移除 PostgreSQL 資料庫中使用 :interval 欄位時的過期警告。

    現在,區間欄位將傳回 ActiveSupport::Duration 物件,而非字串。

    若要保留舊有行為,您可以在模型中新增這行

    attribute :column, :string
    
  • 移除使用 "primary" 作為連線規格名稱來解析連線的已過期支援。

  • 移除引用 ActiveRecord::Base 物件的已過期支援。

  • 移除將 ActiveRecord::Base 物件類型轉換為資料庫值的已過期支援。

  • 移除傳遞欄位給 type_cast 的已過期支援。

  • 移除已過期的 DatabaseConfig#config 方法。

  • 移除已過期的 rake 任務

    • db:schema:load_if_ruby
    • db:structure:dump
    • db:structure:load
    • db:structure:load_if_sql
    • db:structure:dump:#{name}
    • db:structure:load:#{name}
    • db:test:load_structure
    • db:test:load_structure:#{name}
  • 移除使用非確定性順序搜尋的已過期 Model.reorder(nil).first 支援。

  • 移除 Tasks::DatabaseTasks.schema_up_to_date? 中已過期的 environmentname 參數。

  • 移除已過期的 Tasks::DatabaseTasks.dump_filename

  • 移除已過期的 Tasks::DatabaseTasks.schema_file

  • 移除已過期的 Tasks::DatabaseTasks.spec

  • 移除已過期的 Tasks::DatabaseTasks.current_config

  • 移除已過期的 ActiveRecord::Connection#allowed_index_name_length

  • 移除已過期的 ActiveRecord::Connection#in_clause_length

  • 移除已過期的 ActiveRecord::DatabaseConfigurations::DatabaseConfig#spec_name

  • 移除已棄用的 ActiveRecord::Base.connection_config

  • 移除已棄用的 ActiveRecord::Base.arel_attribute

  • 移除已棄用的 ActiveRecord::Base.configurations.default_hash

  • 移除已棄用的 ActiveRecord::Base.configurations.to_h

  • 移除已棄用的 ActiveRecord::Result#map!ActiveRecord::Result#collect!

  • 移除已棄用的 ActiveRecord::Base#remove_connection

8.2 已棄用

  • 已棄用的 Tasks::DatabaseTasks.schema_file_type

8.3 顯著變更

  • 當區塊比預期提早傳回時,回滾交易。

    在這個變更之前,當交易區塊提早傳回時,交易會被提交。

    問題在於交易區塊內觸發的逾時也會讓不完整的交易被提交,因此為了避免這個錯誤,交易區塊會被回滾。

  • 合併同一欄位上的條件不再維持兩個條件,並且會持續被後面的條件取代。

    # Rails 6.1 (IN clause is replaced by merger side equality condition)
    Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
    # Rails 6.1 (both conflict conditions exists, deprecated)
    Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => []
    # Rails 6.1 with rewhere to migrate to Rails 7.0's behavior
    Author.where(id: david.id..mary.id).merge(Author.where(id: bob), rewhere: true) # => [bob]
    # Rails 7.0 (same behavior with IN clause, mergee side condition is consistently replaced)
    Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
    Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => [bob]
    

9 Active Storage

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

9.1 移除

9.2 已棄用

9.3 顯著變更

10 Active Model

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

10.1 移除

  • 移除已棄用的 ActiveModel::Errors 實例作為 Hash 的列舉。

  • 移除已棄用的 ActiveModel::Errors#to_h

  • 移除已棄用的 ActiveModel::Errors#slice!

  • 移除已棄用的 ActiveModel::Errors#values

  • 移除已棄用的 ActiveModel::Errors#keys

  • 移除已棄用的 ActiveModel::Errors#to_xml

  • 移除已棄用的支援將錯誤串接至 ActiveModel::Errors#messages

  • 移除已棄用的支援從 ActiveModel::Errors#messagesclear 錯誤。

  • 移除已棄用的支援從 ActiveModel::Errors#messagesdelete 錯誤。

  • 移除在 ActiveModel::Errors#messages 中使用 []= 的已棄用支援。

  • 移除對 Rails 5.x 錯誤格式的 Marshal 和 YAML 載入支援。

  • 移除對 Rails 5.x ActiveModel::AttributeSet 格式的 Marshal 載入支援。

10.2 已棄用

10.3 顯著變更

11 Active Support

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

11.1 移除

  • 移除已棄用的 config.active_support.use_sha1_digests

  • 移除已棄用的 URI.parser

  • 移除已棄用的支援,使用 Range#include? 來檢查值是否包含在日期時間範圍內。

  • 移除已棄用的 ActiveSupport::Multibyte::Unicode.default_normalization_form

11.2 已棄用

  • 棄用傳遞格式給 ArrayRangeDateDateTimeTimeBigDecimalFloatInteger 中的 #to_s,而改用 #to_fs

    此棄用是為了讓 Rails 應用程式能利用 Ruby 3.1 最佳化,讓某些類型的物件插補更快。

    新的應用程式不會在這些類別中覆寫 #to_s 方法,現有的應用程式可以使用 config.active_support.disable_to_s_conversion

11.3 顯著變更

12 Active Job

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

12.1 移除

  • 移除已棄用的行為,當前一個 callback 使用 throw :abort 停止時,不會停止 after_enqueue/after_perform callback。

  • 移除已棄用的 :return_false_on_aborted_enqueue 選項。

12.2 已棄用

  • 已棄用 Rails.config.active_job.skip_after_callbacks_if_terminated

12.3 顯著變更

13 Action Text

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

13.1 移 除

13.2 已棄用

13.3 顯著變更

14 Action Mailbox

請參閱 變更記錄 以取得詳細變更內容。

14.1 移 除

  • 已移除已棄用的 Rails.application.credentials.action_mailbox.mailgun_api_key

  • 已移除已棄用的環境變數 MAILGUN_INGRESS_API_KEY

14.2 已棄用

14.3 顯著變更

15 Ruby on Rails 指南

請參閱 變更記錄 以取得詳細變更內容。

15.1 顯著變更

16 致謝

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

意見回饋

我們鼓勵您協助提升本指南的品質。

如果您發現任何錯字或事實錯誤,請貢獻您的力量。首先,您可以閱讀我們的 文件貢獻 部分。

您也可能會發現不完整或過時的內容。請務必新增任何缺少的 main 文件。請務必先查看 Edge 指南,以驗證問題是否已在主分支中修復。查看 Ruby on Rails 指南準則 以了解風格和慣例。

如果您發現需要修復但無法自行修補的任何問題,請 開啟問題

最後但並非最不重要的一點,我們非常歡迎在 官方 Ruby on Rails 論壇 上針對 Ruby on Rails 文件進行任何類型的討論。