edge
更多資訊請參考 rubyonrails.org: 更多 Ruby on Rails

Ruby on Rails 5.2 發行說明

Rails 5.2 的亮點:

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

1 升級到 Rails 5.2

如果您正在升級現有應用程式,建議在進行升級之前先進行良好的測試覆蓋。同時,請確保您的應用程式在升級到 Rails 5.2 之前,已先升級到 Rails 5.1 並確保應用程式運行正常。在升級時請注意的事項清單,可在升級 Ruby on Rails指南中找到。

2 主要功能

2.1 Active Storage

拉取請求

Active Storage可協助上傳文件到雲端儲存服務,例如 Amazon S3、Google Cloud Storage 或 Microsoft Azure Storage,並將這些文件附加到 Active Record 物件上。它提供了一個基於本地磁碟的服務,供開發和測試使用,並支援將文件鏡像到從屬服務進行備份和遷移。您可以在Active Storage 概述指南中了解更多。

2.2 Redis Cache Store

拉取請求

Rails 5.2 內建了 Redis 快取存儲。您可以在Caching with Rails: An Overview指南中了解更多。

2.3 HTTP/2 Early Hints

拉取請求

Rails 5.2 支援 HTTP/2 Early Hints。要啟用 Early Hints,請在 bin/rails server 中傳遞 --early-hints

2.4 Credentials

拉取請求

新增 config/credentials.yml.enc 檔案以存儲生產應用程式的機密。它允許將任何第三方服務的驗證憑證直接加密保存在存儲庫中,並使用 config/master.key 檔案或 RAILS_MASTER_KEY 環境變數中的金鑰進行加密。這將最終取代 Rails.application.secrets 和 Rails 5.1 中引入的加密機密。此外,Rails 5.2 還開放了底層 Credentials 的 API,因此您可以輕鬆處理其他加密配置、金鑰和檔案。您可以在保護 Rails 應用程式指南中了解更多。

2.5 Content Security Policy

拉取請求

Rails 5.2 內建了一個新的 DSL,允許您為應用程式配置內容安全策略。您可以配置全域預設策略,然後在每個資源上覆蓋它,甚至使用 lambda 在標頭中注入每個請求的值,例如多租戶應用程式中的帳戶子域。您可以在保護 Rails 應用程式指南中了解更多。

3 Railties

請參考變更日誌以獲得詳細的變更內容。

3.1 廢棄功能

  • 在生成器和模板中廢棄capify!方法。 (拉取請求)

  • 將環境名稱作為常規參數傳遞給rails dbconsolerails console命令已被廢棄。 應改用-e選項。 (提交)

  • 廢棄使用Rails::Application的子類來啟動Rails服務器。 (拉取請求)

  • 在Rails插件模板中廢棄after_bundle回調。 (拉取請求)

3.2 重要變更

  • config/database.yml中新增一個共享部分,將在所有環境中加載。 (拉取請求)

  • railtie.rb添加到插件生成器中。 (拉取請求)

  • tmp:clear任務中清除截圖文件。 (拉取請求)

  • 在運行bin/rails app:update時跳過未使用的組件。 如果初始應用程序生成時跳過了Action Cable、Active Record等,更新任務也會遵循這些跳過。 (拉取請求)

  • 在使用3層數據庫配置時,允許在rails dbconsole命令中傳遞自定義連接名稱。 例如:bin/rails dbconsole -c replica。 (提交)

  • 正確展開運行consoledbconsole命令時環境名稱的快捷方式。 (提交)

  • 在默認的Gemfile中添加bootsnap。 (拉取請求)

  • 通過rails runner支持使用-作為從stdin運行腳本的跨平台方式。 (拉取請求)

  • 在創建新的Rails應用程序時,在Gemfile中添加ruby x.x.x版本並創建包含當前Ruby版本的.ruby-version根文件。 (拉取請求)

  • 在插件生成器中添加--skip-action-cable選項。 (拉取請求)

  • 在插件生成器的Gemfile中添加git_source。 (拉取請求)

  • 在Rails插件中運行bin/rails時跳過未使用的組件。 (提交)

  • 優化生成器操作的縮進。 (拉取請求)

  • 優化路由的縮進。 (拉取請求)

  • 在插件生成器中添加--skip-yarn選項。 (拉取請求)

  • 為生成器的gem方法支持多個版本參數。 (拉取請求)

  • 在開發和測試環境中,從應用程序名稱派生secret_key_base。 (拉取請求)

  • 在默認的Gemfile中以註釋形式添加mini_magick。 (拉取請求)

  • rails newrails plugin new默認包含Active Storage。 添加使用--skip-active-storage跳過Active Storage的功能,並在使用--skip-active-record時自動跳過。 (拉取請求)

4 Action Cable

請參考變更日誌以獲得詳細的變更內容。

4.1 刪除功能

  • 刪除已廢棄的事件驅動Redis適配器。 (提交)

4.2 重要變更

  • 在cable.yml中添加對hostportdbpassword選項的支持。 (拉取請求)

  • 在使用PostgreSQL適配器時,對長流識別符進行哈希。 (拉取請求)

5 Action Pack

請參考變更日誌以獲得詳細的變更內容。

5.1 刪除項目

  • 刪除已棄用的 ActionController::ParamsParser::ParseError。 (Commit)

5.2 廢棄項目

  • 廢棄 ActionDispatch::TestResponse#success?#missing?#error? 別名。 (Pull Request)

5.3 重要變更

  • 新增對片段緩存使用可回收快取鍵的支援。 (Pull Request)

  • 更改片段的快取鍵格式,以便更容易調試鍵的變動。 (Pull Request)

  • 使用GCM對AEAD加密的Cookie和Session進行加密。 (Pull Request)

  • 默認保護免受偽造攻擊。 (Pull Request)

  • 在服務器端強制執行已簽名/已加密的Cookie到期。 (Pull Request)

  • Cookies的 :expires 選項支援 ActiveSupport::Duration 對象。 (Pull Request)

  • 使用Capybara註冊的 :puma 服務器配置。 (Pull Request)

  • 簡化帶有密鑰輪換支援的Cookies中間件。 (Pull Request)

  • 添加啟用HTTP/2的Early Hints功能。 (Pull Request)

  • 在系統測試中添加對無頭Chrome的支援。 (Pull Request)

  • redirect_back 方法中添加 :allow_other_host 選項。 (Pull Request)

  • 使 assert_recognizes 能夠遍歷已掛載的引擎。 (Pull Request)

  • 添加用於配置Content-Security-Policy標頭的DSL。 (Pull Request, Commit, Commit)

  • 註冊現代瀏覽器支援的最流行的音頻/視頻/字體MIME類型。 (Pull Request)

  • 將系統測試的默認截圖輸出從 inline 更改為 simple。 (Commit)

  • 在系統測試中添加對無頭Firefox的支援。 (Pull Request)

  • 在默認標頭集中添加安全的 X-Download-OptionsX-Permitted-Cross-Domain-Policies。 (Commit)

  • 當用戶未手動指定其他服務器時,將系統測試設置為默認使用Puma服務器。 (Pull Request)

  • 在默認標頭集中添加 Referrer-Policy 標頭。 (Commit)

  • ActionController::Parameters#each 中匹配 Hash#each 的行為。 (Pull Request)

  • 為Rails UJS添加自動生成nonce的支援。 (Commit)

  • 更新默認的HSTS max-age值為31536000秒(1年),以滿足https://hstspreload.org/的最小max-age要求。 (Commit)

  • cookies 添加 to_hash 的別名方法。 為 session 添加 to_h 的別名方法。 (Commit)

6 Action View

詳細變更請參閱變更日誌

6.1 刪除項目

  • 刪除已棄用的Erubis ERB處理程序。 (Commit)

6.2 廢棄項目

  • 廢棄 image_tag 生成的圖像的默認alt文本的 image_alt 輔助方法。 (Pull Request)

6.3 重要變更

請參考變更日誌以獲取詳細的變更內容。

6.4 重要變更

  • 允許 Action Mailer 類別配置其傳送工作。 (拉取請求)

  • 新增 assert_enqueued_email_with 測試輔助方法。 (拉取請求)

7 Active Record

請參考變更日誌以獲取詳細的變更內容。

7.1 刪除項目

  • 移除已棄用的 #migration_keys。 (拉取請求)

  • 移除對於 Active Record 物件進行類型轉換時已棄用的 quoted_id 支援。 (提交)

  • 移除對於 index_name_exists? 的已棄用參數 default。 (提交)

  • 移除對於關聯中的 :class_name 傳遞類別的已棄用支援。 (提交)

  • 移除已棄用的方法 initialize_schema_migrations_tableinitialize_internal_metadata_table。 (提交)

  • 移除已棄用的方法 supports_migrations?。 (提交)

  • 移除已棄用的方法 supports_primary_key?。 (提交)

  • 移除已棄用的方法 ActiveRecord::Migrator.schema_migrations_table_name。 (提交)

  • 移除 #indexes 的已棄用參數 name。 (提交)

  • 移除 #verify! 的已棄用參數。 (提交)

  • 移除已棄用的配置 .error_on_ignored_order_or_limit。 (提交)

  • 移除已棄用的方法 #scope_chain。 (提交)

  • 移除已棄用的方法 #sanitize_conditions。 (提交)

7.2 已棄用項目

  • 已棄用 supports_statement_cache?。 (拉取請求)

  • 已棄用同時對 ActiveRecord::Calculations 中的 countsum 傳遞參數和區塊。 (拉取請求)

  • 已棄用在 Relation 中委派給 arel。 (拉取請求)

  • 已棄用 TransactionState 中的 set_state 方法。 (提交)

  • 已棄用 expand_hash_conditions_for_aggregates,無替代方案。 (提交)

7.3 重要變更

  • 當不帶參數呼叫動態固定裝置存取方法時,現在會返回該類型的所有固定裝置。先前此方法總是返回空陣列。 (拉取請求)

  • 修正覆寫 Active Record 屬性讀取器時的屬性變更不一致性。 (拉取請求)

  • 支援 MySQL 的降序索引。 (拉取請求)

  • 修正 bin/rails db:forward 的第一個遷移。 (提交)

  • 在遷移不存在時,在遷移移動時引發 UnknownMigrationVersionError 錯誤。 (提交)

  • 在資料庫結構備份的 rake 任務中尊重 SchemaDumper.ignore_tables。 (拉取請求)

  • 新增 ActiveRecord::Base#cache_version 以支援透過 ActiveSupport::Cache 中的新版本項目的可回收快取鍵。這也意味著 ActiveRecord::Base#cache_key 現在會返回一個不再包含時間戳記的穩定鍵。 (拉取請求)

  • 如果轉換後的值為 nil,則防止創建綁定參數。 (拉取請求)

  • 使用批量 INSERT 插入固定裝置以提高性能。 (拉取請求)

  • 合併表示嵌套連接的兩個關聯不再將合併後關聯的連接轉換為 LEFT OUTER JOIN。 (拉取請求)

  • 修正事務以將狀態應用於子事務。先前,如果有一個嵌套事務並且外部事務被回滾,內部事務的記錄仍然會被標記為已持久化。通過在父事務回滾時將父事務的狀態應用於子事務,此問題已被修正。這將正確地將內部事務的記錄標記為未持久化。 (提交)

  • 修正使用包含連接的範圍時的急切加載/預加載關聯。 (拉取請求)

  • 防止由sql.active_record通知訂閱者引發的錯誤轉換為ActiveRecord::StatementInvalid異常。 (拉取請求)

  • 在處理記錄批次(find_eachfind_in_batchesin_batches)時跳過查詢緩存。 (提交)

  • 將sqlite3的布林序列化更改為使用1和0。 SQLite本地識別1和0為true和false,但以前序列化時不識別't'和'f'。 (拉取請求)

  • 使用多參數賦值構造的值現在將使用後類型轉換值在單字段表單輸入中呈現。 (提交)

  • 在生成模型時不再生成ApplicationRecord。如果需要生成它,可以使用rails g application_record創建。 (拉取請求)

  • Relation#or現在接受兩個僅具有不同references值的關聯,因為references可以被where隱式調用。 (提交)

  • 在使用Relation#or時,提取公共條件並將它們放在OR條件之前。 (拉取請求)

  • 添加binary夾具輔助方法。 (拉取請求)

  • 自動猜測STI的反向關聯。 (拉取請求)

  • 添加新的錯誤類LockWaitTimeout,當鎖等待超時時將引發該錯誤。 (拉取請求)

  • 更新sql.active_record儀器的有效負載名稱以更具描述性。 (拉取請求)

  • 在從數據庫中刪除索引時使用給定的算法。 (拉取請求)

  • Set傳遞給Relation#where現在的行為與傳遞數組相同。 (提交)

  • PostgreSQL的tsrange現在保留次秒精度。 (拉取請求)

  • 在髒記錄中調用lock!時引發異常。 (提交)

  • 修復使用SQLite適配器時,索引的列順序未寫入db/schema.rb的錯誤。 (拉取請求)

  • 修復使用指定VERSIONbin/rails db:migrate命令。 使用空的VERSION執行bin/rails db:migrate的行為與不使用VERSION相同。 檢查VERSION的格式:允許遷移版本號或遷移文件的名稱。如果VERSION的格式無效,則引發錯誤。 如果目標遷移不存在,則引發錯誤。 (拉取請求)

  • 添加新的錯誤類StatementTimeout,當語句超時時將引發該錯誤。 (拉取請求)

  • update_all現在將其值傳遞給Type#cast之前將其傳遞給Type#serialize。這意味著update_all(foo: 'true')將正確地持久化布林值。 (提交)

  • 在關聯查詢方法中使用原始SQL片段時需要明確標記。 (提交, 提交)

  • 在數據庫遷移中添加#up_only,用於僅在遷移上時相關的代碼,例如填充新列。 (拉取請求)

  • 新增錯誤類別 QueryCanceled,當取消語句時由於使用者請求而引發。 (拉取請求)

  • 不允許定義與 Relation 上的實例方法衝突的作用域。 (拉取請求)

  • 將對 PostgreSQL 運算子類別的支援添加到 add_index 中。 (拉取請求)

  • 記錄資料庫查詢的呼叫者。 (拉取請求, 拉取請求, 拉取請求)

  • 在重置欄位資訊時,取消子類別的屬性方法定義。 (拉取請求)

  • 使用子選擇子進行帶有 limitoffsetdelete_all。 (提交)

  • 修正 first(n)limit() 一起使用時的不一致問題。 first(n) 現在尊重 limit(),使其與 relation.to_a.first(n) 的行為一致,也與 last(n) 的行為一致。 (拉取請求)

  • 修正未持久化父實例上的嵌套 has_many :through 關聯。 (提交)

  • 在刪除通過記錄時考慮關聯條件。 (提交)

  • 在調用 savesave! 後不允許已銷毀的物件變異。 (提交)

  • 修正 left_outer_joins 中的關聯合併問題。 (拉取請求)

  • 支援 PostgreSQL 外部表。 (拉取請求)

  • 在複製 Active Record 物件時清除事務狀態。 (拉取請求)

  • 修正使用 composed_of 欄位將 Array 物件作為參數傳遞給 where 方法時未展開的問題。 (拉取請求)

  • 如果 polymorphic? 不正確使用,則使 reflection.klass 引發異常。 (提交)

  • 修正 MySQL 和 PostgreSQL 的 #columns_for_distinct,使 ActiveRecord::FinderMethods#limited_ids_for 使用正確的主鍵值,即使 ORDER BY 列包含其他表的主鍵。 (提交)

  • 修正 has_one/belongs_to 關聯中 dependent: :destroy 的問題,當子類別未被刪除時,父類別被刪除。 (提交)

  • 空閒的資料庫連線(以前僅為孤立的連線)現在由連線池清理程序定期清除。 (提交)

8 Active Model

詳細變更請參閱變更日誌

8.1 重要變更

  • 修正 ActiveModel::Errors 中的 #keys#values 方法。 將 #keys 修改為僅返回沒有空訊息的鍵。 將 #values 修改為僅返回非空值。 (拉取請求)

  • ActiveModel::Errors 添加 #merge! 方法。 (拉取請求)

  • 允許將 Proc 或 Symbol 傳遞給長度驗證器選項。 (拉取請求)

  • _confirmation 的值為 false 時執行 ConfirmationValidator 驗證。 (拉取請求)

  • 使用具有 proc 預設值的屬性 API 的模型現在可以被序列化。 (提交)

  • 在序列化中不會丟失所有具有選項的多個 :includes。 (提交)

9 Active Support

詳細變更請參閱變更日誌

9.1 刪除項目

  • 刪除已棄用的回調的 :if:unless 字符串過濾器。 (提交)

  • 刪除已棄用的 halt_callback_chains_on_return_false 選項。 (提交)

9.2 廢棄功能

  • 廢棄 Module#reachable? 方法。 (拉取請求)

  • 廢棄 secrets.secret_token。 (提交)

9.3 重要更改

  • HashWithIndifferentAccess 添加 fetch_values。 (拉取請求)

  • Time#change 添加對 :offset 的支援。 (提交)

  • ActiveSupport::TimeWithZone#change 添加對 :offset:zone 的支援。 (提交)

  • 將 gem 名稱和廢棄期限傳遞給廢棄通知。 (拉取請求)

  • 添加對版本化快取條目的支援。這使得快取存儲可以重複使用快取鍵,在頻繁變動的情況下大大節省存儲空間。與 Active Record 中 #cache_key#cache_version 的分離以及其在 Action Pack 的片段快取中的使用一起使用。 (拉取請求)

  • 添加 ActiveSupport::CurrentAttributes 以提供線程隔離的屬性單例。主要用例是使所有每個請求的屬性對整個系統易於使用。 (拉取請求)

  • #singularize#pluralize 現在尊重指定語言環境的不可數名詞。 (提交)

  • class_attribute 添加默認選項。 (拉取請求)

  • 添加 Date#prev_occurringDate#next_occurring 以返回指定的下一個/上一個星期幾。 (拉取請求)

  • 為模組和類別屬性訪問器添加默認選項。 (拉取請求)

  • 快取:write_multi。 (拉取請求)

  • ActiveSupport::MessageEncryptor 的默認加密方式設置為 AES 256 GCM 加密。 (拉取請求)

  • 添加 freeze_time 助手,在測試中將時間凍結為 Time.now。 (拉取請求)

  • 使 Hash#reverse_merge! 的順序與 HashWithIndifferentAccess 一致。 (拉取請求)

  • ActiveSupport::MessageVerifierActiveSupport::MessageEncryptor 添加目的和過期支援。 (拉取請求)

  • 更新 String#camelize,在傳遞錯誤選項時提供反饋。 (拉取請求)

  • 如果目標為 nil,Module#delegate_missing_to 現在會像 Module#delegate 一樣引發 DelegationError。 (拉取請求)

  • 添加 ActiveSupport::EncryptedFileActiveSupport::EncryptedConfiguration。 (拉取請求)

  • 添加 config/credentials.yml.enc 以存儲生產應用程式的密鑰。 (拉取請求)

  • MessageEncryptorMessageVerifier 添加密鑰輪換支援。 (拉取請求)

  • HashWithIndifferentAccess#transform_keys 返回 HashWithIndifferentAccess 的實例。 (拉取請求)

  • 如果已定義,Hash#slice 現在會回退到 Ruby 2.5+ 內建的定義。 (提交)

  • IO#to_json 現在返回 to_s 的表示形式,而不是嘗試轉換為數組。這修復了在對不可讀對象調用 IO#to_json 時引發 IOError 的錯誤。 (拉取請求)

  • Time#prev_dayTime#next_day 添加與 Date#prev_dayDate#next_day 一致的方法簽名。允許為 Time#prev_dayTime#next_day 傳遞參數。 (提交)

  • Time#prev_monthTime#next_month 添加與 Date#prev_monthDate#next_month 一致的方法簽名。允許為 Time#prev_monthTime#next_month 傳遞參數。 (提交)

  • Time#prev_yearTime#next_year 添加與 Date#prev_yearDate#next_year 一致的方法簽名。允許為 Time#prev_yearTime#next_year 傳遞參數。 (提交)

  • 修復 humanize 中的縮寫支援。 (Commit)

  • 允許在 TWZ 範圍上使用 Range#include?。 (Pull Request)

  • 快取:對於大於 1kB 的值,默認啟用壓縮。 (Pull Request)

  • Redis 快取存儲。 (Pull Request, Pull Request)

  • 處理 TZInfo::AmbiguousTime 錯誤。 (Pull Request)

  • MemCacheStore:支援過期計數器。 (Commit)

  • 使 ActiveSupport::TimeZone.all 只返回在 ActiveSupport::TimeZone::MAPPING 中的時區。 (Pull Request)

  • 更改 ActiveSupport::SecurityUtils.secure_compare 的默認行為,使其即使對於變長的字符串也不會洩漏長度信息。 將舊的 ActiveSupport::SecurityUtils.secure_compare 重命名為 fixed_length_secure_compare,並在傳遞的字符串長度不匹配時開始引發 ArgumentError。 (Pull Request)

  • 使用 SHA-1 生成非敏感摘要,例如 ETag 標頭。 (Pull Request, Pull Request)

  • assert_changes 將始終斷言表達式發生變化,不論 from:to: 參數組合如何。 (Pull Request)

  • ActiveSupport::Cache::Store 中為 read_multi 添加缺失的儀器。 (Pull Request)

  • assert_difference 中支援以哈希作為第一個參數。 這允許在同一斷言中指定多個數值差異。 (Pull Request)

  • 快取:MemCache 和 Redis 的 read_multifetch_multi 加速。 在查詢後端之前從本地內存快取中讀取。 (Commit)

10 Active Job

詳細更改請參閱 Changelog

10.1 重要更改

  • 允許將區塊傳遞給 ActiveJob::Base.discard_on,以允許自定義處理丟棄的工作。 (Pull Request)

11 Ruby on Rails Guides

詳細更改請參閱 Changelog

11.1 重要更改

12 貢獻者

請參閱 Rails 的完整貢獻者列表,感謝所有花費大量時間使 Rails 成為穩定且強大的框架的人。向他們致敬。

回饋

歡迎協助提升本指南的品質。

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

您也可能會發現不完整的內容或過時的資訊。 請為主要的文件補充任何遺漏的內容。請先檢查 Edge 指南,以確認問題是否已經修復或尚未在主分支上修復。 請參考 Ruby on Rails 指南指引 以了解風格和慣例。

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

最後但同樣重要的是,關於 Ruby on Rails 文件的任何討論都非常歡迎在 官方 Ruby on Rails 論壇 上進行。