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 dbconsole
和rails 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
。 (提交)正確展開運行
console
和dbconsole
命令時環境名稱的快捷方式。 (提交)在默認的
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 new
和rails plugin new
默認包含Active Storage
。 添加使用--skip-active-storage
跳過Active Storage
的功能,並在使用--skip-active-record
時自動跳過。 (拉取請求)
4 Action Cable
請參考變更日誌以獲得詳細的變更內容。
4.1 刪除功能
- 刪除已廢棄的事件驅動Redis適配器。 (提交)
4.2 重要變更
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-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
的別名方法。 為session
添加to_h
的別名方法。 (Commit)
6 Action View
詳細變更請參閱變更日誌。
6.1 刪除項目
- 刪除已棄用的Erubis ERB處理程序。 (Commit)
6.2 廢棄項目
- 廢棄
image_tag
生成的圖像的默認alt文本的image_alt
輔助方法。 (Pull Request)
6.3 重要變更
將
auto_discovery_link_tag
添加:json
類型,以支援JSON Feeds。 (Pull Request)將
image_tag
輔助方法添加srcset
選項。 (Pull Request)修復
field_error_proc
包裝optgroup
和選擇分隔符option
的問題。 (Pull Request)更改
form_with
默認生成ID。 (Commit)添加
preload_link_tag
輔助方法。 (Pull Request)允許使用可調用對象作為分組選擇的分組方法。 (Pull Request)
Action Mailer
請參考變更日誌以獲取詳細的變更內容。
6.4 重要變更
7 Active Record
請參考變更日誌以獲取詳細的變更內容。
7.1 刪除項目
移除已棄用的
#migration_keys
。 (拉取請求)移除對於 Active Record 物件進行類型轉換時已棄用的
quoted_id
支援。 (提交)移除對於
index_name_exists?
的已棄用參數default
。 (提交)移除對於關聯中的
:class_name
傳遞類別的已棄用支援。 (提交)移除已棄用的方法
initialize_schema_migrations_table
和initialize_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
中的count
和sum
傳遞參數和區塊。 (拉取請求)已棄用在
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_each
,find_in_batches
,in_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
的錯誤。 (拉取請求)修復使用指定
VERSION
的bin/rails db:migrate
命令。 使用空的VERSION
執行bin/rails db:migrate
的行為與不使用VERSION
相同。 檢查VERSION
的格式:允許遷移版本號或遷移文件的名稱。如果VERSION
的格式無效,則引發錯誤。 如果目標遷移不存在,則引發錯誤。 (拉取請求)添加新的錯誤類
StatementTimeout
,當語句超時時將引發該錯誤。 (拉取請求)update_all
現在將其值傳遞給Type#cast
之前將其傳遞給Type#serialize
。這意味著update_all(foo: 'true')
將正確地持久化布林值。 (提交)在數據庫遷移中添加
#up_only
,用於僅在遷移上時相關的代碼,例如填充新列。 (拉取請求)新增錯誤類別
QueryCanceled
,當取消語句時由於使用者請求而引發。 (拉取請求)不允許定義與
Relation
上的實例方法衝突的作用域。 (拉取請求)將對 PostgreSQL 運算子類別的支援添加到
add_index
中。 (拉取請求)在重置欄位資訊時,取消子類別的屬性方法定義。 (拉取請求)
使用子選擇子進行帶有
limit
或offset
的delete_all
。 (提交)修正
first(n)
與limit()
一起使用時的不一致問題。first(n)
現在尊重limit()
,使其與relation.to_a.first(n)
的行為一致,也與last(n)
的行為一致。 (拉取請求)修正未持久化父實例上的嵌套
has_many :through
關聯。 (提交)在刪除通過記錄時考慮關聯條件。 (提交)
在調用
save
或save!
後不允許已銷毀的物件變異。 (提交)修正
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 刪除項目
9.2 廢棄功能
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_occurring
和Date#next_occurring
以返回指定的下一個/上一個星期幾。 (拉取請求)為模組和類別屬性訪問器添加默認選項。 (拉取請求)
快取:
write_multi
。 (拉取請求)將
ActiveSupport::MessageEncryptor
的默認加密方式設置為 AES 256 GCM 加密。 (拉取請求)添加
freeze_time
助手,在測試中將時間凍結為Time.now
。 (拉取請求)使
Hash#reverse_merge!
的順序與HashWithIndifferentAccess
一致。 (拉取請求)為
ActiveSupport::MessageVerifier
和ActiveSupport::MessageEncryptor
添加目的和過期支援。 (拉取請求)更新
String#camelize
,在傳遞錯誤選項時提供反饋。 (拉取請求)如果目標為 nil,
Module#delegate_missing_to
現在會像Module#delegate
一樣引發DelegationError
。 (拉取請求)添加
ActiveSupport::EncryptedFile
和ActiveSupport::EncryptedConfiguration
。 (拉取請求)添加
config/credentials.yml.enc
以存儲生產應用程式的密鑰。 (拉取請求)對
MessageEncryptor
和MessageVerifier
添加密鑰輪換支援。 (拉取請求)從
HashWithIndifferentAccess#transform_keys
返回HashWithIndifferentAccess
的實例。 (拉取請求)如果已定義,
Hash#slice
現在會回退到 Ruby 2.5+ 內建的定義。 (提交)IO#to_json
現在返回to_s
的表示形式,而不是嘗試轉換為數組。這修復了在對不可讀對象調用IO#to_json
時引發IOError
的錯誤。 (拉取請求)為
Time#prev_day
和Time#next_day
添加與Date#prev_day
和Date#next_day
一致的方法簽名。允許為Time#prev_day
和Time#next_day
傳遞參數。 (提交)為
Time#prev_month
和Time#next_month
添加與Date#prev_month
和Date#next_month
一致的方法簽名。允許為Time#prev_month
和Time#next_month
傳遞參數。 (提交)為
Time#prev_year
和Time#next_year
添加與Date#prev_year
和Date#next_year
一致的方法簽名。允許為Time#prev_year
和Time#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_multi
和fetch_multi
加速。 在查詢後端之前從本地內存快取中讀取。 (Commit)
10 Active Job
詳細更改請參閱 Changelog。
10.1 重要更改
- 允許將區塊傳遞給
ActiveJob::Base.discard_on
,以允許自定義處理丟棄的工作。 (Pull Request)
11 Ruby on Rails Guides
詳細更改請參閱 Changelog。
11.1 重要更改
添加 Rails 中的線程和代碼執行 指南。 (Pull Request)
添加 Active Storage 概述 指南。 (Pull Request)
12 貢獻者
請參閱 Rails 的完整貢獻者列表,感謝所有花費大量時間使 Rails 成為穩定且強大的框架的人。向他們致敬。
回饋
歡迎協助提升本指南的品質。
如果您發現任何錯別字或事實錯誤,請貢獻您的力量。 開始之前,您可以閱讀我們的 文件貢獻 部分。
您也可能會發現不完整的內容或過時的資訊。 請為主要的文件補充任何遺漏的內容。請先檢查 Edge 指南,以確認問題是否已經修復或尚未在主分支上修復。 請參考 Ruby on Rails 指南指引 以了解風格和慣例。
如果您發現需要修復但無法自行修補的問題,請 開啟一個問題。
最後但同樣重要的是,關於 Ruby on Rails 文件的任何討論都非常歡迎在 官方 Ruby on Rails 論壇 上進行。