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 dbconsole
和rails 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)透過執行
console
和dbconsole
指令適當擴充環境名稱的捷徑。(提交)將
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 new
和rails plugin new
預設會取得Active Storage
。新增使用--skip-active-storage
跳過Active Storage
的功能,並在使用--skip-active-record
時自動執行此動作。(Pull Request)
4 Action Cable
請參閱 變更記錄 以取得詳細變更內容。
4.1 移 除
- 移除已棄用的事件驅動 Redis 介面卡。(提交)
4.2 顯著變更
在 cable.yml 中新增對
host
、port
、db
和password
選項的支援。(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 Request,Commit,Commit)
註冊由現代瀏覽器支援的最受歡迎音訊/視訊/字型 MIME 類型。(Pull Request)
將系統測試螢幕擷取預設輸出從
inline
變更為simple
。(Commit)在系統測試中新增無頭 Firefox 支援。(Pull Request)
在預設標頭集中新增安全的
X-Download-Options
和X-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
至to_h
。為session
新增別名方法to_h
至to_hash
。(提交)
6 Action View
詳情變更請參閱 變更紀錄。
6.1 移除
- 移除已棄用的 Erubis ERB 處理器。(提交)
6.2 已棄用
- 已棄用
image_alt
輔助函式,此函式用於新增預設 alt 文字至由image_tag
產生的圖片。(拉取要求)
6.3 顯著變更
新增
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_table
和initialize_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
中的count
和sum
。(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_each
、find_in_batches
、in_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)
傳遞
Set
給Relation#where
現在的行為與傳遞陣列相同。(Commit)PostgreSQL
tsrange
現在保留次秒精度。(Pull Request)在髒記錄中呼叫
lock!
時引發錯誤。(Commit)修正一個錯誤,當使用 SQLite 介面時,索引的欄位順序不會寫入到
db/schema.rb
中。(Pull Request)修正
bin/rails db:migrate
搭配指定的VERSION
。搭配空VERSION
的bin/rails db:migrate
行為與沒有VERSION
相同。檢查VERSION
的格式:允許遷移版本號碼或遷移檔案名稱。如果VERSION
的格式無效,則引發錯誤。如果目標遷移不存在,則引發錯誤。(Pull Request)新增新的錯誤類別
StatementTimeout
,當陳述式逾時時會引發此錯誤。(Pull Request)update_all
現在會在傳遞給Type#serialize
之前,將其值傳遞給Type#cast
。這表示update_all(foo: 'true')
會正確地保留布林值。(Commit)針對僅在向上遷移時相關的程式碼,將
#up_only
新增至資料庫遷移,例如填入新欄位。(Pull Request)新增錯誤類別
QueryCanceled
,當使用者要求取消陳述式時會引發此錯誤。(Pull Request)不允許定義與
Relation
上的實例方法衝突的範圍。(Pull Request)新增支援 PostgreSQL 算子類別至
add_index
。(Pull Request)記錄資料庫查詢呼叫者。(Pull Request, Pull Request, Pull Request)
在重設欄位資訊時,取消定義後代的屬性方法。(Pull Request)
使用子查詢搭配
limit
或offset
進行delete_all
。(Commit)修復與
limit()
搭配使用時first(n)
的不一致性。first(n)
尋找器現在會遵循limit()
,使其與relation.to_a.first(n)
,以及last(n)
的行為一致。(Pull Request)修復未儲存父實例上的嵌套
has_many :through
關聯。(Commit)刪除記錄時考量關聯條件。(Commit)
在呼叫
save
或save!
之後,不允許已毀損物件變異。(提交)修正
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 移除
10.2 已棄用
已棄用
Module#reachable?
方法。(Pull Request)已棄用
secrets.secret_token
。(Commit)
10.3 顯著變更
新增
HashWithIndifferentAccess
的fetch_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_occurring
和Date#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::MessageVerifier
和ActiveSupport::MessageEncryptor
。(Pull Request)更新
String#camelize
以在傳遞錯誤選項時提供回饋。(Pull Request)Module#delegate_missing_to
現在會在目標為 nil 時引發DelegationError
,類似於Module#delegate
。(Pull Request)新增
ActiveSupport::EncryptedFile
和ActiveSupport::EncryptedConfiguration
。(Pull Request)新增
config/credentials.yml.enc
來儲存生產應用程式的機密。(Pull Request)新增金鑰輪替支援至
MessageEncryptor
和MessageVerifier
。(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_day
、Date#next_day
新增相同的Time#prev_day
和Time#next_day
方法簽章。允許傳遞參數給Time#prev_day
和Time#next_day
。(Commit)根據
Date#prev_month
、Date#next_month
新增相同的Time#prev_month
和Time#next_month
方法簽章。允許傳遞參數給Time#prev_month
和Time#next_month
。(Commit)根據
Date#prev_year
、Date#next_year
新增相同的Time#prev_year
和Time#next_year
方法簽章。允許傳遞參數給Time#prev_year
和Time#next_year
。(Commit)修正
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_multi
和fetch_multi
加速。在諮詢後端之前從本機記憶體快取中讀取。(Commit)
11 Active Job
請參閱 變更記錄以取得詳細變更。
11.1 顯著變更
- 允許將區塊傳遞給
ActiveJob::Base.discard_on
以允許自訂處理捨棄的工作。(Pull Request)
12 Ruby on Rails 指南
請參閱 變更紀錄 以取得詳細變更。
12.1 顯著變更
新增 Rails 中的多執行緒與程式碼執行 指南。(Pull Request)
新增 Active Storage 概觀 指南。(Pull Request)
13 鳴謝
請參閱 Rails 貢獻者完整清單,了解許多人花費許多時間打造 Rails,使其成為穩定且強健的架構。向所有這些人致敬。
回饋
鼓勵您協助提升本指南的品質。
如果您發現任何錯字或事實錯誤,請協助修正。首先,您可以閱讀我們的 文件貢獻 部分。
您也可能會發現不完整內容或未更新的內容。請務必為 main 新增任何遺漏的文件。請務必先查看 Edge Guides,以驗證問題是否已在 main 分支中修正。請查看 Ruby on Rails 指南準則 以了解樣式和慣例。
如果您因為任何原因發現需要修正的事項,但無法自行修正,請 開啟問題。
最後但同樣重要的是,對於 Ruby on Rails 文件的任何討論都非常歡迎在官方 Ruby on Rails 論壇上進行。