v7.1.3.2
更多資訊請參閱 rubyonrails.org: 更多 Ruby on Rails

Ruby on Rails 5.2 版本說明

Rails 5.2 的亮點

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

1 升級到 Rails 5.2

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

2 主要功能

2.1 Active Storage

拉取請求

Active Storage 促進將檔案上傳至雲端儲存服務,例如 Amazon S3、Google Cloud Storage 或 Microsoft Azure Storage,並將這些檔案附加至 Active Record 物件。它附帶一個用於開發和測試的本機磁碟服務,並支援將檔案鏡像至從屬服務以進行備份和遷移。您可以在 Active Storage Overview 指南中進一步了解 Active Storage。

2.2 Redis 快取儲存

拉取請求

Rails 5.2 內建 Redis 快取儲存。您可以在 Caching with Rails: An Overview 指南中進一步了解這一點。

2.3 HTTP/2 早期提示

拉取請求

Rails 5.2 支援 HTTP/2 早期提示。若要啟用早期提示啟動伺服器,請將 --early-hints 傳遞至 bin/rails server

2.4 憑證

拉取請求

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

2.5 內容安全政策

拉取請求

Rails 5.2 附帶一個新的 DSL,讓您可以為您的應用程式設定 內容安全性政策。您可以設定一個全域預設政策,然後在每個資源的基礎上覆寫它,甚至使用 lambda 在標頭中注入每個請求的值,例如多租戶應用程式中的帳戶子網域。您可以在 保護 Rails 應用程式 指南中閱讀更多相關資訊。

3 Railties

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

3.1 已棄用

  • 在產生器和範本中棄用 capify! 方法。(Pull Request)

  • 將環境的名稱作為一般引數傳遞給 rails dbconsolerails console 命令已棄用。應改用 -e 選項。(Commit)

  • 棄用使用 Rails::Application 的子類別來啟動 Rails 伺服器。(Pull Request)

  • 棄用 Rails 外掛範本中的 after_bundle 回呼。(Pull Request)

3.2 顯著變更

  • config/database.yml 中新增一個共用區段,將會載入所有環境。(Pull Request)

  • railtie.rb 新增到外掛產生器。(Pull Request)

  • tmp:clear 任務中清除螢幕擷取檔案。(Pull Request)

  • 在執行 bin/rails app:update 時略過未使用的元件。如果最初的應用程式產生略過 Action Cable、Active Record 等,則更新任務也會遵循這些略過。(Pull Request)

  • 在使用 3 層級資料庫設定時,允許傳遞自訂連線名稱給 rails dbconsole 命令。範例:bin/rails dbconsole -c replica。(Commit)

  • 透過執行 consoledbconsole 指令適當擴充環境名稱的捷徑。(提交

  • bootsnap 加入預設的 Gemfile。(拉取請求

  • 支援 - 作為一個與平台無關的方式,以 rails runner 執行 stdin 的指令碼。(拉取請求

  • ruby x.x.x 版本加入 Gemfile,並在建立新的 Rails 應用程式時,建立包含目前 Ruby 版本的根目錄檔案 .ruby-version。(拉取請求

  • --skip-action-cable 選項加入外掛產生器。(拉取請求

  • git_source 加入外掛產生器的 Gemfile。(拉取請求

  • 在 Rails 外掛中執行 bin/rails 時,略過未使用的元件。(提交

  • 最佳化產生器動作的縮排。(拉取請求

  • 最佳化路由的縮排。(拉取請求

  • --skip-yarn 選項加入外掛產生器。(拉取請求

  • 支援產生器的 gem 方法的版本參數。(拉取請求

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

  • mini_magick 作為註解加入預設的 Gemfile。(拉取請求

  • rails newrails plugin new 預設會取得 Active Storage。新增使用 --skip-active-storage 跳過 Active Storage 的功能,並在使用 --skip-active-record 時自動執行此動作。(Pull Request

4 Action Cable

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

4.1 移 除

  • 移除已棄用的事件驅動 Redis 介面卡。(提交

4.2 顯著變更

  • 在 cable.yml 中新增對 hostportdbpassword 選項的支援。(Pull Request

  • 使用 PostgreSQL 介面卡時,對長串流識別碼進行雜湊處理。(Pull Request

5 Action Pack

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

5.1 移 除

  • 移除已棄用的 ActionController::ParamsParser::ParseError。(提交

5.2 已棄用

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

5.3 顯著變更

  • 新增對片段快取中可回收快取金鑰的支援。(Pull Request

  • 變更片段的快取金鑰格式,以簡化金鑰變動的除錯。(Pull Request

  • 使用 GCM 對 AEAD 加密的 Cookie 和工作階段進行加密。(Pull Request

  • 預設防範偽造。(Pull Request

  • 在伺服器端強制簽署/加密 Cookie 過期時間。(Pull Request

  • Cookie :expires 選項支援 ActiveSupport::Duration 物件。(Pull Request

  • 使用 Capybara 註冊的 :puma 伺服器設定檔。(Pull Request

  • 簡化支援金鑰輪替的 cookie 中介軟體。(Pull Request

  • 新增啟用 HTTP/2 早期提示的功能。(Pull Request

  • 在系統測試中新增無頭 Chrome 支援。(Pull Request

  • redirect_back 方法中新增 :allow_other_host 選項。(Pull Request

  • assert_recognizes 遍歷已掛載的引擎。(Pull Request

  • 新增用於設定 Content-Security-Policy 標頭的 DSL。(Pull RequestCommitCommit

  • 註冊由現代瀏覽器支援的最受歡迎音訊/視訊/字型 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_hashto_h。為 session 新增別名方法 to_hto_hash。(提交

6 Action View

詳情變更請參閱 變更紀錄

6.1 移除

  • 移除已棄用的 Erubis ERB 處理器。(提交

6.2 已棄用

  • 已棄用 image_alt 輔助函式,此函式用於新增預設 alt 文字至由 image_tag 產生的圖片。(拉取要求

6.3 顯著變更

  • 新增 :json 類型至 auto_discovery_link_tag 以支援 JSON Feed。(拉取要求

  • 新增 srcset 選項至 image_tag 輔助函式。(拉取要求

  • 修正 field_error_proc 包覆 optgroup 和選取分隔線 option 的問題。(拉取要求

  • 變更 form_with 以預設產生 id。(提交

  • 新增 preload_link_tag 輔助函式。(拉取要求

  • 允許使用可呼叫物件作為群組選取的群組方法。(拉取要求

7 Action Mailer

詳情變更請參閱 變更紀錄

7.1 顯著變更

  • 允許 Action Mailer 類別設定其傳遞工作。(拉取要求

  • 新增 assert_enqueued_email_with 測試輔助程式。(Pull Request)

8 Active Record

有關詳細變更,請參閱 變更日誌

8.1 移除

  • 移除已棄用的 #migration_keys。(Pull Request)

  • 移除在類型轉換 Active Record 物件時,對 quoted_id 的已棄用支援。(Commit)

  • 移除 index_name_exists? 中已棄用的引數 default。(Commit)

  • 移除在關聯中,傳遞類別給 :class_name 的已棄用支援。(Commit)

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

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

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

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

  • 移除 #indexes 中已棄用的引數 name。(Commit)

  • 移除 #verify! 中已棄用的引數。(Commit)

  • 移除已棄用的組態 .error_on_ignored_order_or_limit。(Commit)

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

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

8.2 已棄用

  • 已棄用 supports_statement_cache?。(Pull Request)

  • 已棄用同時傳遞引數和區塊給 ActiveRecord::Calculations 中的 countsum。(Pull Request)

  • 不建議在 Relation 中委派給 arel。(Pull Request

  • 不建議在 TransactionState 中使用 set_state 方法。(Commit

  • 不建議在沒有替換的情況下使用 expand_hash_conditions_for_aggregates。(Commit

8.3 顯著變更

  • 現在,在不帶參數的情況下呼叫動態固定裝置存取器方法時,它會傳回此類型的所有固定裝置。以前,此方法總是傳回一個空陣列。(Pull Request

  • 覆寫 Active Record 屬性讀取器時,修正與已變更屬性不一致的問題。(Pull Request

  • 支援 MySQL 的遞減索引。(Pull Request

  • 修正 bin/rails db:forward 第一次遷移。(Commit

  • 當目前遷移不存在時,在遷移移動時引發 UnknownMigrationVersionError 錯誤。(Commit

  • 在資料庫結構傾印的 rake 任務中尊重 SchemaDumper.ignore_tables。(Pull Request

  • 新增 ActiveRecord::Base#cache_version 以透過 ActiveSupport::Cache 中的新版本項目支援可回收快取金鑰。這也表示 ActiveRecord::Base#cache_key 現在會傳回一個穩定的金鑰,不再包含時間戳。(Pull Request

  • 如果轉換後的數值為 nil,則防止建立繫結參數。(Pull Request

  • 使用大量插入來插入固定裝置以提升效能。(Pull Request

  • 合併兩個代表巢狀聯結的關聯不再將合併關聯的聯結轉換為 LEFT OUTER JOIN。(Pull Request)

  • 修正交易以將狀態套用到子交易。先前,如果您有巢狀交易且外部交易回滾,內部交易的記錄仍會標示為持續。此問題已透過在回滾父交易時將父交易的狀態套用到子交易來修正。這將正確地將內部交易的記錄標示為非持續。(Commit)

  • 修正包含聯結的範圍的熱切載入/預載入關聯。(Pull Request)

  • 防止由 sql.active_record 通知訂閱者引發的錯誤轉換為 ActiveRecord::StatementInvalid 例外。(Pull Request)

  • 在處理批次記錄 (find_eachfind_in_batchesin_batches) 時略過查詢快取。(Commit)

  • 將 sqlite3 布林序列化變更為使用 1 和 0。SQLite 本機將 1 和 0 辨識為 true 和 false,但不會本機辨識先前序列化的 't' 和 'f'。(Pull Request)

  • 使用多參數指定所建構的值現在會使用單一欄位表單輸入中的後類型轉換值進行呈現。(Commit)

  • 在產生模型時不再產生 ApplicationRecord。如果您需要產生它,可以使用 rails g application_record 建立。(Pull Request)

  • Relation#or 現在接受僅在 references 具有不同值的兩個關聯,因為 references 可以由 where 隱含呼叫。(Commit)

  • 使用 Relation#or 時,提取共同條件並將它們放在 OR 條件之前。(Pull Request

  • 新增 binary fixture 輔助方法。(Pull Request

  • 自動猜測 STI 的反向關聯。(Pull Request

  • 新增新的錯誤類別 LockWaitTimeout,當鎖定等待逾時時會引發此錯誤。(Pull Request

  • 更新 sql.active_record 儀器的載荷名稱,以更具描述性。(Pull Request

  • 從資料庫中移除索引時,使用給定的演算法。(Pull Request

  • 傳遞 SetRelation#where 現在的行為與傳遞陣列相同。(Commit

  • PostgreSQL tsrange 現在保留次秒精度。(Pull Request

  • 在髒記錄中呼叫 lock! 時引發錯誤。(Commit

  • 修正一個錯誤,當使用 SQLite 介面時,索引的欄位順序不會寫入到 db/schema.rb 中。(Pull Request

  • 修正 bin/rails db:migrate 搭配指定的 VERSION。搭配空 VERSIONbin/rails db:migrate 行為與沒有 VERSION 相同。檢查 VERSION 的格式:允許遷移版本號碼或遷移檔案名稱。如果 VERSION 的格式無效,則引發錯誤。如果目標遷移不存在,則引發錯誤。(Pull Request

  • 新增新的錯誤類別 StatementTimeout,當陳述式逾時時會引發此錯誤。(Pull Request

  • update_all 現在會在傳遞給 Type#serialize 之前,將其值傳遞給 Type#cast。這表示 update_all(foo: 'true') 會正確地保留布林值。(Commit

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

  • 針對僅在向上遷移時相關的程式碼,將 #up_only 新增至資料庫遷移,例如填入新欄位。(Pull Request)

  • 新增錯誤類別 QueryCanceled,當使用者要求取消陳述式時會引發此錯誤。(Pull Request)

  • 不允許定義與 Relation 上的實例方法衝突的範圍。(Pull Request)

  • 新增支援 PostgreSQL 算子類別至 add_index。(Pull Request)

  • 記錄資料庫查詢呼叫者。(Pull Request, Pull Request, Pull Request)

  • 在重設欄位資訊時,取消定義後代的屬性方法。(Pull Request)

  • 使用子查詢搭配 limitoffset 進行 delete_all。(Commit)

  • 修復與 limit() 搭配使用時 first(n) 的不一致性。first(n) 尋找器現在會遵循 limit(),使其與 relation.to_a.first(n),以及 last(n) 的行為一致。(Pull Request)

  • 修復未儲存父實例上的嵌套 has_many :through 關聯。(Commit)

  • 刪除記錄時考量關聯條件。(Commit)

  • 在呼叫 savesave! 之後,不允許已毀損物件變異。(提交

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

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

  • 當 Active Record 物件被複製時,清除交易狀態。(拉取請求

  • 修正使用 composed_of 欄位將陣列物件作為引數傳遞給 where 方法時,未擴充的問題。(拉取請求

  • 如果 polymorphic? 未被誤用,則 reflection.klass 會引發。(提交

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

  • 修正 has_one/belongs_to 關係的 dependent: :destroy 問題,其中在子項未被刪除時,父類別會被刪除。(提交

  • 閒置的資料庫連線(以前僅為孤立的連線)現在會定期被連線池收割器清除。(提交

9 Active Model

有關詳細變更,請參閱 變更日誌

9.1 值得注意的變更

  • 修正 ActiveModel::Errors 中的 #keys#values 方法。將 #keys 變更為僅傳回訊息不為空的鍵。將 #values 變更為僅傳回不為空的數值。(Pull Request)

  • 新增 ActiveModel::Errors#merge! 方法。(Pull Request)

  • 允許將 Proc 或 Symbol 傳遞給長度驗證器選項。(Pull Request)

  • _confirmation 的值為 false 時,執行 ConfirmationValidator 驗證。(Pull Request)

  • 使用具有 proc 預設值的屬性 API 的模型現在可以進行封送。(Commit)

  • 在序列化中不遺失所有具有選項的 :includes。(Commit)

10 Active Support

請參閱 Changelog 以取得詳細變更。

10.1 移除

  • 移除已棄用的回呼字串篩選器 :if:unless。(Commit)

  • 移除已棄用的 halt_callback_chains_on_return_false 選項。(Commit)

10.2 已棄用

  • 已棄用 Module#reachable? 方法。(Pull Request)

  • 已棄用 secrets.secret_token。(Commit)

10.3 顯著變更

  • 新增 HashWithIndifferentAccessfetch_values。(Pull Request)

  • 新增對 Time#change:offset 支援。(Commit)

  • 新增對 ActiveSupport::TimeWithZone#change:offset:zone 支援。(Commit)

  • 將 gem 名稱和已棄用時間傳遞給已棄用通知。(Pull Request)

  • 新增對版本化快取條目的支援。這讓快取儲存可以回收快取金鑰,在頻繁變動的情況下大幅節省儲存空間。與 Active Record 中 #cache_key#cache_version 的分離,以及在 Action Pack 的片段快取中使用它們搭配使用。(Pull Request

  • 新增 ActiveSupport::CurrentAttributes 以提供執行緒隔離的屬性單例。主要使用案例是讓所有每個請求的屬性都能輕鬆地供整個系統使用。(Pull Request

  • #singularize#pluralize 現在會尊重指定區域設定的不可數名詞。(Commit

  • 新增 class_attribute 的預設選項。(Pull Request

  • 新增 Date#prev_occurringDate#next_occurring 以傳回指定的下一/前一個星期幾。(Pull Request

  • 新增模組和類別屬性存取器的預設選項。(Pull Request

  • 快取:write_multi。(Pull Request

  • 預設 ActiveSupport::MessageEncryptor 使用 AES 256 GCM 加密。(Pull Request

  • 新增 freeze_time 輔助函式,可在測試中將時間凍結到 Time.now。(Pull Request

  • Hash#reverse_merge! 的順序與 HashWithIndifferentAccess 一致。(Pull Request

  • 新增目的和過期支援至 ActiveSupport::MessageVerifierActiveSupport::MessageEncryptor。(Pull Request

  • 更新 String#camelize 以在傳遞錯誤選項時提供回饋。(Pull Request

  • Module#delegate_missing_to 現在會在目標為 nil 時引發 DelegationError,類似於 Module#delegate。(Pull Request

  • 新增 ActiveSupport::EncryptedFileActiveSupport::EncryptedConfiguration。(Pull Request

  • 新增 config/credentials.yml.enc 來儲存生產應用程式的機密。(Pull Request)

  • 新增金鑰輪替支援至 MessageEncryptorMessageVerifier。(Pull Request)

  • HashWithIndifferentAccess#transform_keys 傳回 HashWithIndifferentAccess 的執行個體。(Pull Request)

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

  • IO#to_json 現在會傳回 to_s 表示,而不是嘗試轉換成陣列。這修正了一個錯誤,在該錯誤中,當對不可讀取的物件呼叫 IO#to_json 時,會引發 IOError。(Pull Request)

  • 根據 Date#prev_dayDate#next_day 新增相同的 Time#prev_dayTime#next_day 方法簽章。允許傳遞參數給 Time#prev_dayTime#next_day。(Commit)

  • 根據 Date#prev_monthDate#next_month 新增相同的 Time#prev_monthTime#next_month 方法簽章。允許傳遞參數給 Time#prev_monthTime#next_month。(Commit)

  • 根據 Date#prev_yearDate#next_year 新增相同的 Time#prev_yearTime#next_year 方法簽章。允許傳遞參數給 Time#prev_yearTime#next_year。(Commit)

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

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

  • 快取:針對大於 1kB 的值啟用預設壓縮。(Pull Request

  • Redis 快取儲存體。(Pull RequestPull 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 RequestPull Request

  • assert_changes 將永遠斷言表達式會變更,不論 from:to: 參數組合為何。(Pull Request

  • ActiveSupport::Cache::Store 中為 read_multi 新增遺失的儀器化。(Pull Request

  • assert_difference 中支援將雜湊作為第一個參數。這允許在同一個斷言中指定多個數字差異。(Pull Request

  • 快取:MemCache 和 Redis read_multifetch_multi 加速。在諮詢後端之前從本機記憶體快取中讀取。(Commit

11 Active Job

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

11.1 顯著變更

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

12 Ruby on Rails 指南

請參閱 變更紀錄 以取得詳細變更。

12.1 顯著變更

13 鳴謝

請參閱 Rails 貢獻者完整清單,了解許多人花費許多時間打造 Rails,使其成為穩定且強健的架構。向所有這些人致敬。

回饋

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

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

您也可能會發現不完整內容或未更新的內容。請務必為 main 新增任何遺漏的文件。請務必先查看 Edge Guides,以驗證問題是否已在 main 分支中修正。請查看 Ruby on Rails 指南準則 以了解樣式和慣例。

如果您因為任何原因發現需要修正的事項,但無法自行修正,請 開啟問題

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