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 提供了以功能性方式分割 (多個分割區、不同的 schema) 資料庫的能力,但無法支援水平分片 (相同的 schema、多個分割區)。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
的物件當作第一個引數傳遞的已棄用支援。移除
ActionView::Base#initialize
中已棄用的format
引數。移除已棄用的
ActionView::Template#refresh
。移除已棄用的
ActionView::Template#original_encoding
。移除已棄用的
ActionView::Template#variants
。移除已棄用的
ActionView::Template#formats
。移除已棄用的
ActionView::Template#virtual_path=
。移除已棄用的
ActionView::Template#updated_at
。移除
ActionView::Template#initialize
中需要的已棄用updated_at
引數。移除已棄用的
ActionView::Template.finalize_compiled_template_methods
。移除已棄用的
config.action_view.finalize_compiled_template_methods
移除以區塊呼叫
ActionView::ViewPaths#with_fallback
的已棄用支援。移除將絕對路徑傳遞至
render template:
的已棄用支援。移除將相對路徑傳遞至
render file:
的已棄用支援。移除不接受兩個引數的範本處理程式的支援。
移除
ActionView::Template::PathResolver
中已棄用的 pattern 引數。移除在某些視圖輔助方法中,從物件呼叫私有方法的已棄用支援。
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
kwarg。當
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 移除
當
config.i18n.fallbacks
為空時,移除對I18n.default_locale
的已棄用回溯。移除已棄用的
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
以在資料庫 fixture 中產生<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 成為穩定且強大的框架的人。感謝所有他們。