1 升級到 Rails 6.1
如果您要升級現有應用程式,在進行之前最好有良好的測試涵蓋率。如果您尚未升級到 Rails 6.0,也應該先升級,並確保您的應用程式在嘗試更新到 Rails 6.1 之前仍能如預期執行。升級時需要注意的事項清單可在升級 Ruby on Rails指南中找到。
2 主要功能
2.1 每個資料庫連線切換
Rails 6.1 提供您 切換每個資料庫連線 的功能。在 6.0 中,如果您切換到 reading
角色,則所有資料庫連線也會切換到 reading 角色。現在在 6.1 中,如果您在設定檔中將 legacy_connection_handling
設為 false
,Rails 將允許您透過在對應的抽象類別上呼叫 connected_to
來切換單一資料庫的連線。
2.2 水平分片
Rails 6.0 提供了功能分區(多個分區、不同架構)資料庫的功能,但無法支援水平分片(相同架構、多個分區)。Rails 無法支援水平分片,因為 Active Record 中的模型每個角色每個類別只能有一個連線。現在已修復此問題,並提供 水平分片 與 Rails。
2.3 嚴格載入關聯
嚴格載入關聯 讓您可以確保所有關聯都急切載入,並在發生 N+1 之前停止。
2.4 委派類型
委派類型 是單一表格繼承的替代方案。這有助於表示類別階層,允許超類別是一個由其自己的表格表示的具體類別。每個子類別都有自己的表格,用於額外的屬性。
2.5 非同步刪除關聯
非同步刪除關聯 為應用程式新增在背景工作中 destroy
關聯的功能。在刪除資料時,這可以幫助您避免應用程式中的逾時和其他效能問題。
3 Railties
有關詳細變更,請參閱 變更日誌。
3.1 移除
移除已棄用的
rake notes
任務。移除
rails dbconsole
指令中已棄用的connection
選項。移除
rails notes
中已棄用的SOURCE_ANNOTATION_DIRECTORIES
環境變數支援。移除 rails server 指令中已棄用的
server
參數。移除已棄用,使用
HOST
環境變數來指定伺服器 IP 的支援。移除已棄用的
rake dev:cache
任務。移除已棄用的
rake routes
任務。移除已棄用的
rake initializers
任務。
3.2 棄用
3.3 顯著變更
4 Action Cable
有關詳細變更,請參閱 變更日誌。
4.1 移除
4.2 棄用
4.3 顯著變更
5 Action Pack
有關詳細變更,請參閱 變更日誌。
5.1 移除
移除已棄用的
ActionDispatch::Http::ParameterFilter
。移除控制器層級已棄用的
force_ssl
。
5.2 棄用
- 棄用
config.action_dispatch.return_only_media_type_on_content_type
。
5.3 顯著變更
- 變更
ActionDispatch::Response#content_type
以傳回完整的 Content-Type 標頭。
6 Action View
有關詳細變更,請參閱 變更日誌。
6.1 移除
移除
ActionView::Template::Handlers::ERB
中已棄用的escape_whitelist
。從
ActionView::Resolver
中移除已棄用的find_all_anywhere
。從
ActionView::Template::HTML
中移除已棄用的formats
。從
ActionView::Template::RawFile
中移除已棄用的formats
。從
ActionView::Template::Text
中移除已棄用的formats
。從
ActionView::PathSet
中移除已棄用的find_file
。從
ActionView::LookupContext
中移除已棄用的rendered_format
。從
ActionView::ViewPaths
中移除已棄用的find_file
。移除已棄用的支援,在
ActionView::Base#initialize
中傳遞一個不是ActionView::LookupContext
的物件作為第一個引數。移除已棄用的
format
引數ActionView::Base#initialize
。移除已棄用的
ActionView::Template#refresh
。移除已棄用的
ActionView::Template#original_encoding
。移除已棄用的
ActionView::Template#variants
。移除已棄用的
ActionView::Template#formats
。移除已棄用的
ActionView::Template#virtual_path=
。移除已棄用的
ActionView::Template#updated_at
。移除已棄用的
updated_at
引數,在ActionView::Template#initialize
中需要。移除已棄用的
ActionView::Template.finalize_compiled_template_methods
。移除已棄用的
config.action_view.finalize_compiled_template_methods
移除已棄用的支援,使用區塊呼叫
ActionView::ViewPaths#with_fallback
。移除已棄用的支援,傳遞絕對路徑給
render template:
。移除已棄用的支援,傳遞相對路徑給
render file:
。移除對不接受兩個引數的範本處理常式的支援。
移除已棄用的
ActionView::Template::PathResolver
中的模式引數。移除已棄用的支援,從某些檢視輔助程式中的物件呼叫私人方法。
6.2 已棄用
6.3 顯著變更
要求
ActionView::Base
子類別實作#compiled_method_container
。讓
locals
參數成為ActionView::Template#initialize
的必要參數。javascript_include_tag
和stylesheet_link_tag
資源輔助函式會產生一個Link
標頭,提供提示給現代瀏覽器,用於預載資源。這可以透過將config.action_view.preload_links_header
設定為false
來停用。
7 Action Mailer
請參閱 變更日誌 以取得詳細變更內容。
7.1 移除
- 移除已棄用的
ActionMailer::Base.receive
,改用 Action Mailbox。
7.2 已棄用
7.3 顯著變更
8 Active Record
請參閱 變更日誌 以取得詳細變更內容。
8.1 移除
從
ActiveRecord::ConnectionAdapters::DatabaseLimits
移除已棄用的方法。column_name_length
table_name_length
columns_per_table
indexes_per_table
columns_per_multicolumn_index
sql_query_length
joins_per_query
移除已棄用的
ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_multi_insert?
。移除已棄用的
ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_foreign_keys_in_create?
。移除已棄用的
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#supports_ranges?
。移除已棄用的
ActiveRecord::Base#update_attributes
和ActiveRecord::Base#update_attributes!
。從
ActiveRecord::ConnectionAdapter::SchemaStatements#assume_migrated_upto_version
移除已棄用的migrations_path
參數。移除已棄用的
config.active_record.sqlite3.represent_boolean_as_integer
。從
ActiveRecord::DatabaseConfigurations
移除已棄用的方法。fetch
each
first
values
[]=
移除已棄用的
ActiveRecord::Result#to_hash
方法。移除已棄用的
ActiveRecord::Relation
方法中使用不安全原始 SQL 的支援。
8.2 已棄用
已棄用
ActiveRecord::Base.allow_unsafe_raw_sql
。已棄用
connected_to
上的database
關鍵字參數。當
legacy_connection_handling
設為 false 時,已棄用connection_handlers
。
8.3 顯著變更
MySQL:唯一性驗證器現在會遵循預設資料庫排序規則,預設不再強制執行大小寫敏感的比對。
relation.create
不會再在初始化區塊和回呼中向類別層級查詢方法洩漏範圍。之前
User.where(name: "John").create do |john| User.find_by(name: "David") # => nil end
之後
User.where(name: "John").create do |john| User.find_by(name: "David") # => #<User name: "David", ...> end
命名範圍鏈不再會向類別層級查詢方法洩漏範圍。
class User < ActiveRecord::Base scope :david, -> { User.where(name: "David") } end
之前
User.where(name: "John").david # SELECT * FROM users WHERE name = 'John' AND name = 'David'
之後
User.where(name: "John").david # SELECT * FROM users WHERE name = 'David'
where.not
現在會產生 NAND 謂詞,而非 NOR。之前
User.where.not(name: "Jon", role: "admin") # SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'
之後
User.where.not(name: "Jon", role: "admin") # SELECT * FROM users WHERE NOT (name = 'Jon' AND role = 'admin')
若要使用新的每個資料庫連線處理,應用程式必須將
legacy_connection_handling
變更為 false,並移除connection_handlers
上已棄用的存取器。connects_to
和connected_to
的公開方法不需要變更。
9 Active Storage
請參閱 變更記錄,以取得詳細變更。
9.1 已移除
已移除已棄用的支援,以將
:combine_options
作業傳遞給ActiveStorage::Transformers::ImageProcessing
。已移除已棄用的
ActiveStorage::Transformers::MiniMagickTransformer
。已移除已棄用的
config.active_storage.queue
。已移除已棄用的
ActiveStorage::Downloading
。
9.2 已棄用
- 已棄用
Blob.create_after_upload
,改用Blob.create_and_upload
。(Pull Request)
9.3 顯著變更
- 已新增
Blob.create_and_upload
,以建立新的 blob 並將指定的io
上傳至服務。(Pull Request) - 已新增
ActiveStorage::Blob#service_name
欄位。升級後必須執行遷移。執行bin/rails app:update
以產生該遷移。
10 Active Model
請參閱 變更記錄 以取得詳細變更。
10.1 移除
10.2 棄用
10.3 顯著變更
- Active Model 的錯誤現在是具有介面的物件,讓您的應用程式可以更輕鬆地處理和互動模型所擲回的錯誤。 此功能 包含查詢介面,能進行更精確的測試,並存取錯誤詳細資料。
11 Active Support
請參閱 變更記錄 以取得詳細變更。
11.1 移除
移除已棄用的回退至
I18n.default_locale
,當config.i18n.fallbacks
為空時。移除已棄用的
LoggerSilence
常數。移除已棄用的
ActiveSupport::LoggerThreadSafeLevel#after_initialize
。移除已棄用的
Module#parent_name
、Module#parent
和Module#parents
。移除已棄用的檔案
active_support/core_ext/module/reachable
。移除已棄用的檔案
active_support/core_ext/numeric/inquiry
。移除已棄用的檔案
active_support/core_ext/array/prepend_and_append
。移除已棄用的檔案
active_support/core_ext/hash/compact
。移除已棄用的檔案
active_support/core_ext/hash/transform_values
。移除已棄用的檔案
active_support/core_ext/range/include_range
。移除已棄用的
ActiveSupport::Multibyte::Chars#consumes?
和ActiveSupport::Multibyte::Chars#normalize
。移除已棄用的
ActiveSupport::Multibyte::Unicode.pack_graphemes
、ActiveSupport::Multibyte::Unicode.unpack_graphemes
、ActiveSupport::Multibyte::Unicode.normalize
、ActiveSupport::Multibyte::Unicode.downcase
、ActiveSupport::Multibyte::Unicode.upcase
和ActiveSupport::Multibyte::Unicode.swapcase
。移除已棄用的
ActiveSupport::Notifications::Instrumenter#end=
。
11.2 棄用
- 棄用
ActiveSupport::Multibyte::Unicode.default_normalization_form
。
11.3 顯著變更
12 Active Job
請參閱 變更記錄 以取得詳細變更。
12.1 移除
12.2 已棄用
- 已棄用
config.active_job.return_false_on_aborted_enqueue
。
12.3 顯著變更
- 在中斷排程工作時傳回
false
。
13 Action Text
請參閱 變更日誌 以取得詳細變更內容。
13.1 移除
13.2 已棄用
13.3 顯著變更
新增方法,在富文字屬性的名稱後加上
?
,以確認富文字內容是否存在。(Pull Request)新增
fill_in_rich_text_area
系統測試案例輔助工具,以尋找 trix 編輯器並填入指定的 HTML 內容。(Pull Request)新增
ActionText::FixtureSet.attachment
,以在資料庫固定裝置中產生<action-text-attachment>
元素。(Pull Request)
14 Action Mailbox
請參閱 變更日誌 以取得詳細變更內容。
14.1 移除
14.2 已棄用
- 已棄用
Rails.application.credentials.action_mailbox.api_key
和MAILGUN_INGRESS_API_KEY
,改用Rails.application.credentials.action_mailbox.signing_key
和MAILGUN_INGRESS_SIGNING_KEY
。
14.3 顯著變更
15 Ruby on Rails 指南
請參閱 變更日誌 以取得詳細變更內容。
15.1 顯著變更
16 致謝
請參閱 Rails 貢獻者完整清單,以了解許多人花費許多時間,讓 Rails 成為穩定且強大的架構。向所有這些人致敬。
意見回饋
我們鼓勵您協助提升本指南的品質。
如果您發現任何錯字或事實錯誤,請協助我們修正。首先,您可以閱讀我們的 文件貢獻 章節。
您也可能會發現內容不完整或已過時。請務必新增任何主程式遺失的說明文件。請務必先查看Edge Guides,以驗證問題是否已在主分支中修復。查看Ruby on Rails 指南準則,了解樣式和慣例。
如果您發現需要修復但無法自行修補的任何原因,請開啟問題。
最後但並非最不重要的一點是,歡迎在官方 Ruby on Rails 論壇上針對 Ruby on Rails 說明文件進行任何討論。